当前位置: 首页 > 知识库问答 >
问题:

为什么可比自然排序需要与相等方法一致?

苏乐童
2023-03-14

休假后回来:)带着问题。我正在阅读比较接口留档从比较文档。我明白,我们使用可比,因为它将为我们提供排序和自然排序。在留档中,它被写成。

强烈建议(尽管不是必需的)自然顺序与equals一致。这是因为没有显式比较器的排序集(和排序映射)在与自然顺序与equals不一致的元素(或键)一起使用时表现“奇怪”。特别是,这样的排序集(或排序映射)违反了用equals方法定义的set(或映射)的一般约定。

“可比”与“相等”之间的关系。Comparable有compareTo方法,为什么它需要与equals方法一致?我无法理解这个概念。

也引用消息来源,有人能详细说明这一点吗

例如,如果添加两个键a和b,使得(!a.equals(b)

谢谢

共有3个答案

李安歌
2023-03-14

您可以在Set的文档中看到:

请注意,如果要正确实现{@code set}接口,集合维护的顺序(无论是否提供显式比较器)必须与equals一致。(参见{@code Comparable}或{@code Comparator},了解与equals一致的的精确定义)这是因为{@code Set}接口是根据{@code equals}操作定义的,但是{@code TreeSet}实例使用其{@code compareTo}(或{@code compare})方法执行所有元素比较,因此,从集合的角度来看,该方法认为相等的两个元素是相等的。集合的行为定义良好,即使其顺序与等于不一致;它只是没有遵守{@code Set}接口的一般约定。

彭雨华
2023-03-14

简短回答:每当compareTo(a,b)为两个对象ab返回0时,a.equals(b)b.equals(a)应为true,反之亦然。

详细回答:正如Comparable文档中所述,Comparable的实现强制执行总排序。全序的一个性质是“反对称”:如果我们定义一个全序≤, 然后:

如果a≤b且b≤a则a=b

这表示为compareTo()0返回值。

您引用的文本中提到的方法和类利用了这一特性,以实现更正确、更高效的行为。

黄隐水
2023-03-14

返回0的compareTo的语义学是两个对象是相等的。在另一个方法中对相同关系的另一个定义显然会导致许多种麻烦,正如你引用的那样:SortedSet实现中的典型算法依赖于compareTo,但是<代码>Set接口指定它不能包含两个对象,这两个对象是equalscompareToequals的报告不一致将导致这种情况。

 类似资料:
  • 来自Javadoc的: 注:如果对象用作中的键或中的元素,则应小心操作,因为的自然顺序与等于的顺序不一致。 例如,如果您创建一个并向其中添加和,则该集合将包含两个元素(因为值具有不同的比例,因此根据和,它们是不相等的),但是,如果对

  • 我想使用而不是,并重构了以下代码: 这个(版本2): 两者都返回相同的元素。然而,我怀疑我是否真的应该用的更详细的代码替换我所有的。为什么我需要在mapMuli(

  • 问题内容: 如果binarySearch方法要求您先对数组进行排序,然后再将其作为参数传递给方法调用,那么为什么不对binarySearch方法进行排序呢? 问题答案: 二进制搜索的工作原理是假设数组的中间包含数组中的中值。如果未排序,则此假设就没有意义,因为中位数可以在任何地方,并且将数组减半可能意味着您削减了要搜索的数字。 二进制搜索不进行排序本身的原因是因为它不需要…该数组已排序。

  • 我发现 比 Python 2 和 3 中的函数慢。 Python 2 蟒蛇 3 为什么<code>max</code>(<code>O(n)</code>)比<code>sort</code>函数(<code<O(nlogn)</code>)慢?

  • 问题内容: 我在这里张贴了一些代码,可以正确解决发布者遇到的问题。OP希望删除重复项,并将某些特殊项放在列表的顶部。我在一个特殊的类中使用,包装了他们正在使用的类,以实现他们想要的。 然后我开始思考......像你一样......我是通过返回消除重复从方法,而不是通过返回从实现作为一个需要做的正确指示在重复(自定义一个的)。 我不反对使用此技术,但我是否使用了可能被视为 未记录的功能 ?我是否可以

  • Java8中的类定义了一个方法,该方法需要一个参数。下面是方法签名: 在Java8中,下面的代码可以很好地工作。但是,我预计会出现类似“Integer类没有定义compareTo(Integer,Integer)”这样的编译错误。 有人能解释为什么可以将的实例传递给需要实例的方法,尽管它们的方法签名不兼容?