gpt4 book ai didi

Java TreeMap 包含一个键但调用 containsKey 返回 false(即使键是完全相同的未更改对象)

转载 作者:搜寻专家 更新时间:2023-11-01 00:57:04 25 4
gpt4 key购买 nike

为什么可以循环 keySet的 TreeMap 并获得 .containsKey == false

for (Object thisObject : map.keySet()) {
if (!map.containsKey(thisObject)) {
System.out.println("This line should be never reached.");
}
}

经过多次不同的迭代和调用,这条线被命中。 map.get(thisObject)会返回 null .但是调试显示键(相同的引用、值和散列)和实际值在映射中。 map 很小(25 个元素)TreeMap<Long, Double>

更新:

正如 @rgettman 所猜测的那样有一个自定义排序 Comparator在构造 TreeMap 时使用(没看到它,因为它是从另一个类构造的)。这个比较器只是(我猜)从 here 复制粘贴的

改变 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;
...

解决了这个问题。这个问题在数百万次操作之后出现的原因是没有任何情况下 map 对两个不同的键有两个相似的值,因为这在上下文中是不太可能的。

所以在:

25151l, 1.7583805400614032
24827l, 1.7583805400614032

它失败了。

感谢您的帮助!

最佳答案

您必须更改支持 entrySet()/Map.Entry 从而更改键顺序,从而导致搜索失败 containsKey

关于Java TreeMap 包含一个键但调用 containsKey 返回 false(即使键是完全相同的未更改对象),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18109674/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com