为什么可以循环keySet
TreeMap 并获得一个.containsKey == false
?
for (Object thisObject : map.keySet()) {
if (!map.containsKey(thisObject)) {
System.out.println("This line should be never reached.");
}
}
经过很多,很多不同的迭代和调用这条线被击中。Amap.get(thisObject)
会返回null
。但调试显示键(相同的引用、值和哈希)和实际值在映射中。地图很小(25 个元素)TreeMap<Long, Double>
更新:
正如@rgettman猜测的那样,在构造 TreeMap 时使用了一种自定义排序Comparator
(没有看到它,因为它是从另一个类构造的)。这个比较器只是(我猜)从这里复制粘贴
改变Comparator
:
public int compare(Object a, Object b) {
if((Double)base.get(a) > (Double)base.get(b)) {
return 1;
} else if((Double)base.get(a) == (Double)base.get(b)) {
return 0;
} else {
return -1;
}
}
至
...
} else if(base.get(a).equals(base.get(b))) {
return 0;
...
解决问题。这个问题在数百万次操作之后出现的原因是,没有任何情况下映射具有两个不同键的两个相似值,因为这在上下文中是非常不可能的。
所以在:
25151l, 1.7583805400614032
24827l, 1.7583805400614032
它失败。
谢谢你的帮助!