我试图从TreeMap获取,但即使密钥存在也返回null。 HashCode和eqauls仅基于单词。可比较基于频率。
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
答案 0 :(得分:1)
TreeMap
使用compareTo
方法来确定密钥排序和密钥相等。
由于您的Word
课程在其freq
方法中使用compareTo
字段,因此认为具有相同Word
的任何两个freq
相等。
...但是有序映射使用compareTo(或compare)方法执行所有键比较,因此从排序映射的角度来看,这种方法认为相等的两个键是相等的。
答案 1 :(得分:1)
在compareTo
方法中,它会比较频率。因此,如果频率相同则相等。
比较你可以使用的词语
return this.word.compareTo(o.word);
或比较您可以使用的单词和频率
return this.word.compareTo((o.word)) * this.freq.compareTo(o.freq);
修改强>
现在,您需要使用频率进行排序,而不是使用可比较的频率,您可以使用Comparator
。使用上面的比较器创建Map。并使用您之前的编译器进行排序。
创建时
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));
}
});
答案 2 :(得分:0)
如果课程单词不能正确覆盖Equals和hashcode,则此代码无法正常工作...
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));
答案 3 :(得分:0)
这就是TreeMpa.get()方法中确实发生的事情,
while (p != null) {
int cmp = k.compareTo(p.key);
if (cmp < 0)
p = p.left;
else if (cmp > 0)
p = p.right;
else
return p;
}
TreeMpa使用 compareTo 方法查找值。所以它将遍历所有项目,直到 k.compareTo(p.key)返回0
答案 4 :(得分:0)
由于您的 Word 类实现了Comparable接口。所以 TreeMap 使用 compareTo 方法来比较对象的属性。
如果你想得到具有相同字符串的对象&#34;字&#34;然后实现compareTo方法,如
@Override
public int compareTo(Word o) {
return this.word.compareTo(o.word);
}