import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
public class WordCount {
public static void main(String[] args){
WordCount wc = new WordCount();
File file = new File("C:/Users/wjk/Desktop/新建文件夹/新建文本文档.txt");
BufferedReader br;
try {
br = new BufferedReader(new FileReader(file));
StringBuffer sb = new StringBuffer();
String temp = "";
while((temp = br.readLine())!=null)
sb.append(temp);
temp = sb.toString();
String[] split = temp.split("\\W+");
Set<Word> set = wc.wordCountMain(split);
for(Word w : set){
System.out.println(w);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//这是21题部分
// public static Map<String,Integer> wordCountMain(String[] split){
// Map<String, Integer> map = new HashMap<String, Integer>();
// for(String str : split){
// if(map.containsKey(str)){
// Integer i = map.get(str);
// map.replace(str, i+1);
// }else
// map.put(str, 1);
// }
// return map;
// }
//这是22题部分
public Set<Word> wordCountMain(String[] split){
Set<Word> set = new HashSet<Word>();
for(String str : split){
Word w = new Word(str,1);
if(set.contains(w))
for(Word wd : set){
//特别要注意这里只能用equals比较 不能用==比较
if( wd.word.equals(str) ){
set.remove(wd);
set.add(new Word(wd.word,wd.times+1));
break;
}
}
else
set.add(w);
}
return set;
}
public class Word {
public Word(String word,int times){
this.word = word;
this.times = times;
}
public String word;
public Integer times;
@Override
public boolean equals(Object w){
//特别要注意这里只能用equals比较 不能用==比较
if(word.equals(((Word)w).word))
return true;
return false;
}
@Override
public String toString(){
return word + " : "+times;
}
@Override
public int hashCode(){
//HashSet的中的值是唯一的 其唯一性由hashCode方法和equals方法一起确定
//新添加的对象 先判断对象的hash值是否与已经存在HashSet中的某个对象的hash值相等
//1)相等 则用equals判断两个对象是否相等 相等则不插入 不相等则插入到该hash值对应位置之后第一个空位置
//其实可以想象成一个数组 如果数组满了则扩容一次 将上个HashSet中的内容重新计算hash值并加入到新的数组中
//2)不相等 则表示在这个数组中该hash值对应位置是空的 当然元素就可以被添加到该位置
return word.hashCode();
}
}
}
Thinking in Java 第11章22题 分析
最新推荐文章于 2024-07-27 13:31:57 发布