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

“比较法违反了一般合同”——即使正确实施了比较器

寿丰
2023-03-14

我对collection.sort()方法有一些问题。

Java . lang . illegalargumentexception:比较法违反了它的通用契约!

位于Java . util . Tim sort . merge lo(Tim sort . Java:747)

at java.util.TimSort.mergeAt(TimSort.java:483)

位于java.util.TimPort.mergeCollapse(TimPort.java:410)

位于java.util.TimPort.sort(TimPort.java:214)

位于Java . util . Tim sort . sort(Tim sort . Java:173)

at java.util.Arrays.sort(Arrays.java:659)

java.util.Collections.sort(Collections.java:217)

这是我的比较器

public int compare(Key key1, Key key2)
{

    if (key1.Score > key2.Score)
        return -1;

    else if(key1.Score < key2.Score)

        return 1;

    else

        return 0;
}

我目前是 jdk 1.7,我也尝试使用 1.6,但它不起作用。我无法理解这是排序方法的问题还是其他问题。(我正在尝试对包含 1000 多个项目的列表进行排序,但它没有任何 NaN)。

共有1个答案

汝岳
2023-03-14

违反比较方法的一般约定意味着它不能提供一致或正确的答案。似乎此方法在多次比较相同的对象时不会返回相同的结果。

此代码作为独立版本工作正常。您是否还有其他一些线程正在修改集合项?

 类似资料:
  • 作为实习的一部分,我被要求调查一个错误。一段代码正在抛出 Java . lang . illegalargumentexception:比较法违反了它的通用契约! 自定义通过查看自定义类的成员变量来比较两个自定义类: 此自定义类的 方法查看此自定义类的 成员变量。我们很难重现这种行为。我的下意识反应是将自定义中的 return 语句替换为 ,但我的团队怀疑这会解决问题。谁能提供任何见解?

  • 我看到我的应用程序在一些中国 Android 手机上发生了很多崩溃,并出现错误:比较方法违反了其总合同! 我读过这与Collections.sort有关。 我不太确定的是,这是否是因为我的自定义比较器。 以下是错误发生的地方: 比较器是这样的: 所以我不太确定比较器是否搞砸了什么,或者我是否需要以不同的方式进行collections.sort调用 感谢任何帮助

  • 下面的代码是Dave Koelle的AlphanumComparator的编辑版本。编辑包含将空字符串排序到列表末尾或 底部的代码。问题是 为了解决我的问题,我调查了它并找到了诸如比较器没有 等原因; 在正确的位置。我还在Java错误数据库中发现了一条评论,上面写着 java.util.Arrays.sort和java.util.Collections.sort(间接地)使用的排序算法被替换了,新

  • 我目前正在Java中对集合进行排序。我收到了错误消息“比较方法违反了它的一般契约”。我也理解这个错误消息,但我(主要)使用Long类型的构建比较方法。所以我不知道,在这种情况下,排序方法仍然违反了契约。这是我的代码: 这里是错误:

  • 我有一个类字段,和。我需要使用对它们进行排序,但我得到了一个异常: java.lang.IllegalArgumentException:比较方法违反了它的一般约定! 我的< code>compareTo方法: 请帮我找出compareTo方法中的错误。谢了。

  • 问题内容: 我收到以下错误:“比较方法违反了它的一般约定!” 当使用以下比较器时,但是我无法使用jUnit复制异常。我想知道是什么引起了这个问题以及如何复制它。有一些其他例子也有相同的问题,但没有类似的例子。 通过使用以下代码调用该代码: `` Collections.sort(dtos, new DtoComparator()); ``` 谢谢你的帮助。 额外信息:该错误似乎发生在Java ut