0

我刚刚编写了一个测试程序来违反使用 Tim Sort 的 Java 7 的 compareTo 方法中的传递性。下面是我比较的实现。

@Override
public int compareTo(ComparableObject o) {
    if (o.getId() != 0 && this.getId() != 0) {
        if (o.getId() < this.getId()) {
            return 1;
        } else if (o.getId() > this.getId()) {
            return -1;
        } else {
            return 0;
        }
    }
    return 0;

}

正如预期的那样,当我尝试运行程序时它会引发以下异常,因为它违反了传递性 -

Exception in thread "main" 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.Arrays.sort(Unknown Source)
at java.util.Arrays.sort(Unknown Source)
at java.util.ArrayList.sort(Unknown Source)
at java.util.Collections.sort(Unknown Source)
at MainClass.main(MainClass.java:24)

检查零(对于整数)或空(对于字符串或任何其他对象)值并仅在两个元素不为零或不为空时才比较这两个元素而不会出现 Tim Sort 异常的最佳方法是什么?我怎样才能编写上面的代码,这样我就不会得到错误,而只比较非零整数?

4

0 回答 0