我正在开发一个Java应用程序,并且是使用TreeMap的新手。程序需要跟踪文本文件中每个单词的出现次数。但是,我在将数据放入TreeMap时遇到了麻烦。
当我使用相同的代码将数据放入HashMap时,它工作正常,但我需要按值对数据进行排序。
我已经在这两天工作了,我完全难过了!任何建议都将不胜感激。
我设计了一个小示例代码集来演示问题:
词类:
public class impents Comrable {
public Wo (String s) {
this.tesdxt = s;
thnt = 1;
}
public int coeTo (Object x) {
sd
if (thiunt < temp.count){
ret
return 1;
}sd
}
public void inemnt(){
this.cot++;
}
public bolean equals(Object obj){
d temp= ((ls(temp.text) &&
this.unt == temp.count;
}
public int hashCode(){
return this.tshCode() +
Integer.toSsdtring(count).hashCode();
}s
public String toString(){
return this.text;
}
}
计数课程:
public class Counts{
public Counts () { }
public iutTest(){
for(int i = 0; i < 5; i++){
sortedCoun.put(new Word("testWord #"+i), 1);
}
return sortedWordCounts.size();
}
}
比较者类:
public class Sorteparator impleWord,Integer> map) {
this.map = map;
}
public int compare(Object o1, Object o2) {
if(!map.consKey(o1) || !map.coninsKey(o2)) {
return 0;
}
if(mapet(o1) < map.get(o2)) {
retrn ap.get(o2)) {
return 0;
} ee {
return -1;
}
}
}
答案 0 :(得分:2)
您的代码存在许多问题。
首先,TreeMap按其键排序;不是它的价值观。
其次,如果在Map或Set(值影响其equals()方法合约时)值可能会发生变化,则不能使用任何键作为键。
第三,你不应该在没有实现hashCode()的情况下实现equals()。
那些应该让你成为那里的一部分!
答案 1 :(得分:0)
你的compareTo()
说如果两个单词具有相同的计数则相等。因此,Treemap认为您正在输入5个相等的对象并且只保留一个。我不确定为什么你把计数作为Word的一部分,计数似乎是你正在使用Treemap的。