1

我有以下树图:

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

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

System.out.println(distances); 

产量:

{Face=12, Foo=2}

但是,即使正确返回 2,也会返回。以前distances.get(Face)可以正常工作,但由于某种原因,它停止工作。请注意,我在为两个键调用 get()之前打印出地图,所以我没有不小心将 Face 的值更改为 null。有没有其他人遇到过这个问题?有什么我可以做的吗?我只是想弄清楚如何调试这个问题,这很糟糕。nulldistances.get(Foo)distances.get(Face)

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

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

4

5 回答 5

5

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

顺便说一句,当您在最初的问题中说您正在使用String对象时,您对自己造成了伤害——字符串是不可变的,这里没有考虑它们的比较方法,所以问题根本不同;既然我们知道涉及您自己的代码,那么可能的解决方案领域就更广泛了。

于 2010-04-21T03:42:20.067 回答
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。

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

于 2010-04-21T03:03:39.480 回答
0

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

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

于 2010-04-21T03:09:37.693 回答
0

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

于 2010-04-21T03:20:29.303 回答
0

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

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

于 2010-04-21T04:36:37.313 回答