Java TreeMap不会比较映射中的每个元素

Java TreeMap不会比较映射中的每个元素,java,treemap,Java,Treemap,这是一个一般性的问题: 我正在TreeMap中编写一个自定义比较器来比较自定义类a(由我自己定义)。我发现,当我不断向树映射中添加键值对时,新添加的键不会比较树映射中的每个键,而是只比较底部的几个键,跳过顶部的一些键。这样树映射中就有了重复的键 以前有人问过这个问题吗?同样,这是一个一般性的问题,代码,尤其是用于测试的数据集,是不向公众开放的。这是预期的行为。TreeMap类被实现为一个二进制搜索树。因此,它只需要访问总节点数的以2为底的对数。您可以在实现中亲自看到这种行为,其中代码决定是否需要

这是一个一般性的问题: 我正在TreeMap中编写一个自定义比较器来比较自定义类a(由我自己定义)。我发现,当我不断向树映射中添加键值对时,新添加的键不会比较树映射中的每个键,而是只比较底部的几个键,跳过顶部的一些键。这样树映射中就有了重复的键


以前有人问过这个问题吗?同样,这是一个一般性的问题,代码,尤其是用于测试的数据集,是不向公众开放的。

这是预期的行为。
TreeMap
类被实现为一个二进制搜索树。因此,它只需要访问总节点数的以2为底的对数。您可以在实现中亲自看到这种行为,其中代码决定是否需要访问左或右子节点。有关详细信息,请查看
put()
get()
方法实现。

您确定要在比较器函数中强制使用“总排序”吗?您没有提供任何细节,因此很难提供更详细的答案。你确定你的
A
classes equals/hashcode设置正确吗?听起来像是你的自定义比较器坏了。一个正确编写的比较器不必比较映射中的每个键。听起来你真正想要的是一个
map
,但是你需要
P
来拥有一个正确的
比较器
可比的
,或者
hashCode
等于
实现。同意Louis的观点。如果顺序无关紧要,那么普通的
HashMap
将是您最快的选择。然后,您必须在键的类上实现
hashCode
equals
,而不需要比较器。但是有没有办法比较所有键?因为我关心的是相等,而不是更大或更小。
TreeMap
的行为是,当它找到一个等价键时,用新值替换该值。请参阅我在答案中发布的链接的第558行。这回答了你的问题吗?你是说我需要修改源代码?我想知道有没有一个简单的解决方案?@teddy很可能实现一个正常、正确的比较器要比尝试编写一个比较所有键的实现更容易。你几乎永远都不想实现自己的树。JDK中有几种实现,几乎在任何情况下都能非常好地工作。正如@LouisWasserman所指出的,很可能需要使用Map,mos-tlikley和HashMap来提高速度。您需要处理的唯一细节是写入比较器并将同一个键的值添加到列表中。