分析一个字符串中各个单词出现的频率,并将单词和它出现的频率输出显示

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

/**

 * 

 * @author 吴思婷

 * 2016-4-02

 * WordNum类用来计算英语句子中出现的单词频率

 * 假设单词之间用空格隔开,不考虑句子中的" . "和" ' "等符号,以及全角的情况

 */

public class WordNum {

private Map<String, Integer> Map;  //用键值对存储单词和它出现的频率

public WordNum(String Words){

Map=this.getArray(Words);

}

/**

 * 该方法按照空格拆分句子中的单词,放入数组,统计数组中相同单词的个数,并放入键值对数组中

 * @param Words   英语句子

 * @return Map  用于存储单词及其频率的键值对

 */

public Map<String,Integer> getArray(String Words){

String[] wordsArray = Words.split("\s");

Map<String, Integer> Map=new HashMap<String, Integer>();

int arrLength=wordsArray.length;

int currentNum=0;

for(int i=0;i<arrLength;i++){

if("".equals(wordsArray[i].trim())){

continue;

}

if(!Map.containsKey(wordsArray[i])){

//首次出现,放入键值对

Map.put(wordsArray[i],1);

}else {

//键值对中已存在的,键值增加1,删除,重新添加此键值对

currentNum=Map.get(wordsArray[i])+1;

Map.remove(wordsArray[i]);

Map.put(wordsArray[i],currentNum);

}

}

return Map;

}

/**

 * 输出显示单词及其频率

 */

public void Result(){

//keySet()方法生成键视图,还需wordsMap.get()一次,所以效率较低

//entrySet()方法直接生成键-值对视图,无需在get一次,效率较高

        //Iterator iterator= wordsMap.keySet().iterator(); 

    Iterator iterator=Map.entrySet().iterator();

         while(iterator.hasNext())   { 

             Map.Entry entry=(Map.Entry)iterator.next();

             System.out.println("在句子单词"+entry.getKey()+"出现了"+entry.getValue()+"次!");

         } 

}

}

import org.junit.Before;

import org.junit.Test;

public class WordNumTest {

//测试只考虑了句子正常输入时候的情况,尚未考虑当句子首尾有空格、空格不止一个,

//空格为为Tab键时候的情况,并且符号也被计数

@Test

public void testOutputResult(){

System.out.println("单词出现频率单元测试:");

String str="NO , Is NO Pain NO Gain";

WordNum wordFreq=new WordNum(str);

wordFreq.Result();

}

}

原文地址:https://www.cnblogs.com/thereisa/p/5359600.html