java - 建筑物 compareTo : Comparison method violates its general contract

标签 java sorting collections

我目前正在努力用 Java 对集合进行排序。我收到错误消息“Comparison method violates its General contract”。我也理解此错误消息,但我(主要)使用 Long 类型的内置 compareTo-Method。所以我不知道,在这种情况下 sort 方法仍然违反了契约(Contract)。这是我的代码:

@Override
public int compareTo(DataAge another) {
    if(this == null || another == null)
        return 0;

    Long a = new Long(this.getAge());
    Long b = new Long(another.getAge());
    return a.compareTo(b);
}

这里是错误:

Java exception occurred:
java.lang.IllegalArgumentException: Comparison method violates its general contract!

at java.util.ComparableTimSort.mergeLo(Unknown Source)

at java.util.ComparableTimSort.mergeAt(Unknown Source)

at java.util.ComparableTimSort.mergeCollapse(Unknown Source)

at java.util.ComparableTimSort.sort(Unknown Source)

at java.util.ComparableTimSort.sort(Unknown Source)

at java.util.Arrays.sort(Unknown Source)

at java.util.Collections.sort(Unknown Source)

at dd.GMAAnalyzer.sortData(Analyzer.java:158)

最佳答案

假设 null 是允许的,你的方法的逻辑是不正确的,因为 null 比较等于任何东西。这是错误的,因为它将比较等于多个本身不相等的事物,从而破坏了传递性。

要解决此问题,请确定 null 应该排在其他数字的前面还是后面,并添加一个单独的 null 比较(this 不能等于 null,因此您不需要对其进行比较)。

if(another == null)
    return 1; // If you want nulls in the back, return -1

关于java - 建筑物 compareTo : Comparison method violates its general contract,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38565922/

相关文章:

用于数据转换的 Java Functions 与 Spring Converter

java - 如何在 context.xml 中存储字符串值

电子交易所top K股算法

c# - 按属性搜索最快的 C# 集合

java - 静态字段的范围是什么?

java - 在 Java 中,如何获取从一种方法的用户输入中获得的变量并在另一种方法中使用输出?

javascript - 在 Angular 中按数字排序

java - 修改了冒泡排序,但无法正常工作

python - python中的计数器可以这样比较吗?

java - 将平面列表元素转换为java中的嵌套集合