Java treemap对containsKey()使用compareTo而不是equals
我尝试使用Java treemap对containsKey()使用compareTo而不是equals,java,equals,treemap,compareto,Java,Equals,Treemap,Compareto,我尝试使用TreeMap的containsKey方法,但不知何故我遇到了问题 树映射中存储的对象被定义为equals()不能提供与compareTo()相同的结果。这是有意的 但是,java.util.Map的文档中说: 如果此映射包含指定键的映射,则返回true。更正式地说,当且仅当此映射包含键k的映射,使得(key==null?k==null:key.equals(k))时,返回true。(最多可以有一个这样的映射。) 所以我试着如下: c = someModifiedObject(); b
TreeMap
的containsKey
方法,但不知何故我遇到了问题
树映射中存储的对象被定义为equals()
不能提供与compareTo()
相同的结果。这是有意的
但是,java.util.Map
的文档中说:
如果此映射包含指定键的映射,则返回true。更正式地说,当且仅当此映射包含键k的映射,使得(key==null?k==null:key.equals(k))
时,返回true。(最多可以有一个这样的映射。)
所以我试着如下:
c = someModifiedObject();
boolean t1 = sm.containsKey(c);
someObject c2 = new someObject();
boolean t2 = sm.containsKey(c2);
boolean t3 = c.equals(new Chain());
int t4 = c.compareTo(new Chain());
t1为真,因为对象位于树映射中。
t3为真,因为t1等于t3(关于更改equals()
运算符)
t4为假
然而,t2也是错误的。似乎TreeMap
使用compareTo()
而不是equals()
来确定对象是否存在
是否有另一个排序映射的实现,在这里我可以使用
equals()
来检查对象是否存在?虽然没有标准的java API来准确地获取您想要的内容,但您可以创建自己的比较器接口,然后让您的树映射实现这个比较器。您可以重写compareTo()
方法,使其以您想要的方式运行(在您的情况下,使其与equals()
方法的运行方式相同)。使用使compareTo与equals一致的比较器,或者更好地修复compareTo方法,使其与equals一致。与equals不一致的比较方法应该作为比较器来实现,而不是类固有的自然顺序。但文档还指出:“集合框架接口中的许多方法都是根据equals方法定义的。例如,containsKey(对象键)的规范方法说:“[太长,不适合注释,但这是您给出的定义]”此规范不应被解释为暗示使用非null参数键调用Map.containsKey将导致key.equals(k)可以为任何键k调用。实现可以自由实现优化,从而避免equals调用,例如,首先比较两个键的散列码。“为什么在&Dedity的绿色地球中,您希望compareTo
和equals
不对等响应???(请记住,任何有序的集合都会使用相对比较来确定集合中实体的相对位置,因此自然会使用compareTo
。要使equals
具有“逻辑性”,需要使用无序集合)。@hotricks:假设一个类有两个类型为bigdecimic
的字段,并希望按第一个字段进行排序,按第二个字段进行子排序(对于第一个字段匹配的值)。为了允许(1.00,2.0)在(1.0,1.0)和(1.0,3.0)之间进行排序,BigDecimal
的关系比较器必须忽略精度[小数后的零数]。另一方面,即使1.00既不高于也不低于1.0,这并不意味着它应该被视为等效。@supercat-compareTo和equals应该是一致的。如果需要其他比较运算符,请使用不同的名称。