java.lang.IllegalArgumentException Comparison 方法违反了它的一般契约!在集合中#sort

标签 java illegalargumentexception

此异常的原因可能是什么:

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 ...
}

其中参数.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% 情况下出现此问题的代码示例?

最佳答案

您的比较方法根据 getValue() 返回的值比较两个对象。由于该值可能会在对同一对象的该方法的连续调用中发生变化,因此这可能会导致不一致。看来值(value)取决于时间,这是一个坏主意。

假设您比较 object1 和 object2 并发现 compare(object1, object2) < 0 。现在,您将 object2 与 object1 进行比较,发现 compare(object2, object1) < 0 。这违反了比较方法的约定,因为一个对象不能既小于又大于另一个对象。自从每次调用您的getValue给出了不同的结果,似乎随着时间的推移而增加,该对象得到了 getValue被称为稍后可能有更高的getValue()如果所有其他参数确定 getValue()这两个对象是相等的。

关于java.lang.IllegalArgumentException Comparison 方法违反了它的一般契约!在集合中#sort,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26777302/

相关文章:

java - 如果类位于包中,如何从命令行运行 JUnit 测试?

java - Android 11 : Primary directory (invalid) not allowed for content://media/external/file allowed directories are [Download, 文档]

java - 警告 [org.directwebremoting.dwrp.BaseCallHandler] 处理批处理时出现异常

java - 在 JavaFX 中将 ImageView[] 数组添加到 BorderPane 时出错

java - Hibernate Search 尝试猜测未索引实体的字段桥

java - UUID.fromString() 返回无效的 UUID?

java - 生成 Hibernate 映射文件时未创建注释

保留顺序,不允许重复,并允许除按对象之外的删除和插入的java数据结构

java - 如何在eclipse java中从数据资源加载图像

java - LiteFactory.createGlympse() 错误 (Android)