TreeMap随机停止正确返回值

时间:2010-04-21 03:00:35

标签: java treemap

我有以下TreeMap:

TreeMap<String, Integer> distances = new TreeMap<String, Integer>();

它包含两个字符串,“Face”和“Foo”,具有适当的值,例如:

System.out.println(distances); 

收率:

{Face=12, Foo=2}

但是,distances.get(Face)会返回null,即使distances.get(Foo)正确返回2.之前,distances.get(Face)有效,但由于某种原因,它停止了工作。注意我在为两个键调用get()之前打印出地图 right ,所以我没有意外地将Face的值更改为null。有没有人遇到过这个问题?有什么我能做的吗?我只是想弄清楚如何调试这个问题,我度过了一段可怕的时光。

注意:在实际代码中,我实际上并没有使用字符串,而是使用不同的对象,因此它是:TreeMap<Object, Integer>。所以它不仅仅是变量名与文字字符串的混淆。

SECOND注意:对于我正在使用的对象hashcode()equals()的实现,我也非常有信心。 (另外,如果我的实现不正确,它不会从一开始就不起作用吗?而不是停止随机工作?)

5 个答案:

答案 0 :(得分:5)

回复您的说明:每个人都在询问您是否正确覆盖了equals()hashcode() - 这很重要,是的。但这是一个TreeMap,这意味着您还必须关心比较 - 无论您使用的是Comparable个对象还是外部的Comparator,您需要确保您的比较是一致(您的对象是否可变?)并且它们与您的equals()方法一致。

顺便提一下,当你在原始问题中说你正在使用String个对象时,你自己也是一种伤害 - 字符串是不可变的,他们的比较方法在这里没有考虑,所以这个问题根本不同;既然我们知道你自己的代码,那么可能的解决方案领域就更广泛。

答案 1 :(得分:0)

您确定值“Foo”和“Face”都是Strings吗?

此代码适用于我:

        TreeMap<String, Integer> map = new TreeMap<String, Integer>();
        map.put("a", 1);
        map.put("b", 2);

        System.out.println(map);
        System.out.println(map.get("a"));
        System.out.println(map.get("b"));

输出{a = 1,b = 2} 1 2。

在您的情况下,如果FooFace不是String,则地图不能将它们用作查找的键。也许您正在使用get(Face),您应该使用get("Face")

答案 2 :(得分:0)

您是否将字符串文字"Face"与名为Face的变量混淆了?如果您真的使用distances.get(Face),这意味着您正在尝试传入变量Face,并且您将null退出并不奇怪(除非这是一个字符串您之前已添加到地图中的内容的变量。)

而是尝试distances.get("Face")。如果可行,则表示"Face"是您用作键的字符串 - 与可能包含字符串的变量Face不同。

答案 3 :(得分:0)

@smessing您是否在您的类上正确实现了Foo和Face所属的对象的equalshashcode方法? 如果要将对象存储在List,Map或Set中,则需要实现equals和hashCode,以便它们遵守文档中指定的标准合同。 如果没有正确完成这些操作,get操作可能会导致意外的结果,如上所述。

答案 4 :(得分:0)

如果要为Face分配其他参考对象/变量,请检查它是否变为空。

如果您的face对象指向另一个对象的引用而另一个对象将其设置为null,则Face也将变为null。