我试图从 TreeMap 获取数据,但即使键存在它也会返回 null。
HashCode 和 equals 仅基于单词。可比性基于频率。
public static void main(){
TreeMap<Word,Integer> test = new TreeMap<>();
test.put(new Word("pqr",12),1);
test.put(new Word("abc",2),1);
Integer prq = test.get(new Word("pqr",1));
System.out.println(prq);
prq = test.get(new Word("pqr",12));
System.out.println(prq);
}
public class Word implements Comparable<Word>{
String word;
Integer freq;
public Word(String word, Integer freq) {
this.word = word;
this.freq = freq;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Word)) return false;
Word word1 = (Word) o;
return word.equals(word1.word);
}
@Override
public int hashCode() {
return word.hashCode();
}
@Override
public int compareTo(Word o) {
return this.freq.compareTo(o.freq);
}
}
输出就像
无效的
1
In your compareTo
方法是比较频率。因此,如果频率相同,则它是相等的。
比较你可以使用的单词
return this.word.compareTo(o.word);
或者比较您可以使用的单词和频率
return this.word.compareTo((o.word)) * this.freq.compareTo(o.freq);
EDIT
现在,由于您需要使用频率进行排序,因此您可以使用而不是使用可比较的Comparator
。使用上面的比较器来创建地图。并使用之前的比较器进行排序。
在创作时
TreeMap<Word, Integer> test = new TreeMap<Word, Integer>(
new Comparator<Word>() {
public int compare(Word word, Word o) {
return word.word.compareTo((o.word));
}
});
并且在排序时
Collections.sort(new LinkedList(test.keySet()), new Comparator<Word>() {
public int compare(Word word, Word o) {
return word.freq.compareTo((o.freq));
}
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)