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

java.lang.IllegalArgumentExc的比较方法违反了它的一般合同!在集合#排序[重复]

齐英朗
2023-03-14

这种异常的原因是什么:

java.lang.IllegalArgumentException: Comparison method violates its general contract!
        at java.util.TimSort.mergeLo(TimSort.java:747)
        at java.util.TimSort.mergeAt(TimSort.java:483)
        at java.util.TimSort.mergeForceCollapse(TimSort.java:426)
        at java.util.TimSort.sort(TimSort.java:223)
        at java.util.TimSort.sort(TimSort.java:173)
        at java.util.Arrays.sort(Arrays.java:659)
        at java.util.Collections.sort(Collections.java:217)
        ...

我使用的比较器如下:

private Comparator<SomeObject> comporator = new Comparator<SomeObject>() {
    public int compare(SomeObject o1, SomeObject o2) {
        return Double.compare(o2.getValue(), o1.getValue());
    }
};

public double getValue() {
    double value = 0;
    for (Parameter parameter : parametrs()) {
        value = value + (parameter.getWeight() * parameter.getSomeValue(this));
    }
    return value;//20.0, 23.0 ...
}

其中 parameter.getSomeValue:

public int getSomeValue(SomeObject process) {
    return (int) ((System.currentTimeMillis() - process.getPutTime()) / 1000);
}

在:

public void sort() {
    synchronized (list) {
        Collections.sort(list, comporator);
    }
}

哪里:

List<SomeObject> list = new ArrayList<SomeObject>();

我不能重现这个异常,但它有时会出现。此外,您能给出100%出现此问题的代码示例吗?

共有1个答案

曾明诚
2023-03-14

您的compare方法基于< code>getValue()返回的值比较两个对象。由于该值可能会在对同一对象连续调用该方法时发生变化,这可能会导致不一致。似乎价值取决于时间,这是一个坏主意。

假设您将object1与object2进行比较,并找出< code>compare(object1,object2)

 类似资料:
  • 我正在将我们的项目升级到java 7。我遇到了Collections.sort()的非法参数异常。我知道这个异常的原因是java 7中新的Timsort(我确实抛出了之前在这个问题上提出的所有问题)。现在我需要修改比较逻辑来克服这个异常。这是我的比较方法 > < li> 我尝试覆盖equals()方法,使用与compare相同的逻辑,认为如果equals和compare返回相同的结果,应该可以解决

  • 我不确定出了什么问题。我查阅了其他类似的关于堆栈溢出的问题和答案,但不确定我的方法有什么问题。我是java初学者,所以任何帮助都将是巨大的。谢谢你。 我的代码是: 错误:

  • 是的,我知道有很多问题与相同的问题,但我似乎真的找不到我的比较器有什么问题。 所以,这里是: 代码非常简单:我需要根据它们如何改变我的主要结构对一些对象进行排序,并且我首先想要最高值。 由于计算或对象的影响可能需要一些时间,我只是缓存值以便重用它们,因此在排序之前,我检查是否有缓存值或是否需要计算它。 一旦我计算出将< code>m1或< code>m2应用于我的结构的结果,我就将更改恢复。 你可

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

  • 我的一个应用程序曾经抛出一个IllegalArgumentException,指出比较方法违反了其一般合同。我找到了一些详细说明该问题的资源,例如 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6804124 和 http://www.oracle.com/technetwork/java/javase/compatibility-41701

  • 我知道它已经被询问和回答了数百万次,但我仍然无法弄清楚为什么我在排序期间收到了违规。这是我的代码: 我收到了这个错误 有什么想法吗?