TreeMap.get()返回Null偶数键存在

时间:2017-04-06 04:52:41

标签: java treemap

我试图从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

5 个答案:

答案 0 :(得分:1)

TreeMap使用compareTo方法来确定密钥排序和密钥相等。

由于您的Word课程在其freq方法中使用compareTo字段,因此认为具有相同Word的任何两个freq相等。

来自documentation of TreeMap

  

...但是有序映射使用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);
}