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();
}
}