Java 集合排序 : Comparison method violates its general contract

标签 java sorting collections comparison

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

Collections.sort(sorted, new Comparator<MyObject>() {
    @Override
    public int compare(MyObject m1, MyObject m2) {
        // Actual energy comparison :-
        // THE higher the energy, the earlier in the list
        float delta = m1.getTotalEnergy() - m2.getTotalEnergy();

        if (delta > 0) {
            return 1;
        } else if (delta < 0) {
            return -1;
        } else {
            return 0;
        }
    }
});

我收到这个错误

java.lang.IllegalArgumentException: Comparison method violates its general contract!  
        at java.util.TimSort.mergeHi(TimSort.java:895)  
        at java.util.TimSort.mergeAt(TimSort.java:512)  
        at java.util.TimSort.mergeForceCollapse(TimSort.java:453)  
        at java.util.TimSort.sort(TimSort.java:250)  
        at java.util.Arrays.sort(Arrays.java:1512)  
        at java.util.ArrayList.sort(ArrayList.java:1454)  
        at java.util.Collections.sort(Collections.java:175)

有什么想法吗?

最佳答案

假设 getTotalEnergy() 返回 float,您可以使用

return new Float(m1.getTotalEnergy()).compareTo(m2.getTotalEnergy());

使用 Float.valueOf(float)效率可能稍微高一点,希望这更容易阅读。

Float f1 = Float.valueOf(m1.getTotalEnergy());
Float f2 = Float.valueOf(m2.getTotalEnergy());
return f1.compareTo(f2);

关于Java 集合排序 : Comparison method violates its general contract,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28004269/

相关文章:

java - setItemChecked() 函数来保留选择

c# - 最佳表/枚举驱动的方法调用系统

文本框的 Java 集合实现

java - 如何根据来自不同 Java 类的字段比较 "equivalence"的两个集合?

java - 如何用我自己的对象洗牌 list(arrayList> ?

java - 是什么阻止使 Cloneable 成为像 StringBuilder 这样的可变对象?

java - 如何检查 ArrayList 的特定元素的唯一性

java - twosorts 只给我一个问题

c# - 如何在列表中查找重复项并按出现次数对它们进行排序

iphone - 如何在 Objective-C 中对一串字符进行排序?