Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java treemap对containsKey()使用compareTo而不是equals_Java_Equals_Treemap_Compareto - Fatal编程技术网

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应该是一致的。如果需要其他比较运算符,请使用不同的名称。