【问题标题】:java.lang.IllegalArgumentException Comparison method violates its general contract! in Collections#sort [duplicate]java.lang.IllegalArgumentException 比较方法违反了它的一般约定!在 Collections#sort [重复]
【发布时间】:2014-11-06 18:47:16
【问题描述】:

此异常可能是什么原因:

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% 的情况下出现的代码示例吗?

【问题讨论】:

    标签: java illegalargumentexception


    【解决方案1】:

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

    假设您比较 object1 和 object2 并找出 compare(object1, object2) &lt; 0。现在,您将 object2 与 object1 进行比较并找出 compare(object2, object1) &lt; 0。这违反了 compare 方法的约定,因为一个对象不能比另一个对象更小和更大。由于对getValue 的每次调用都会给出不同的结果,这似乎会随着时间的推移而增加,如果确定getValue() 的所有其他参数在两个对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-29
      相关资源
      最近更新 更多