java - 为什么 Comparator<Integer[]> 抛出异常?

标签 java comparator

我遇到了异常

java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeHi(TimSort.java:868)
at java.util.TimSort.mergeAt(TimSort.java:485)
at java.util.TimSort.mergeCollapse(TimSort.java:408)
at java.util.TimSort.sort(TimSort.java:214)
at java.util.TimSort.sort(TimSort.java:173)
at java.util.Arrays.sort(Arrays.java:659)
at Main.main(Main.java:64)

使用此代码时:

Arrays.sort(arr, new Comparator<Integer[]>(){  //arr is 2D array
        public int compare(Integer[] o1, Integer[] o2){
            return o1[2]==o2[2]?0:o1[2]>o2[2]?1:-1;
        }
    });

我认为这与不满足比较的传递性有关,但是当我做了这样的小改变时:

Arrays.sort(arr, new Comparator<Integer[]>(){  //arr is 2D array
        public int compare(Integer[] o1, Integer[] o2){
            return o1[2].compareTo(o2[2]); // here is the change
        }
    });

不再生成异常。 我无法理解这个问题的解释,因为我确信除了 CompareTo() 方法之外,还可以使用关系运算符(>、<、=)来比较 Integer 实例

Integer x = 1;
Integer y = 2;
System.out.println(x<y);

按预期打印 true

任何机构可以澄清吗?

最佳答案

问题在于:

o1[2]==o2[2]

这是比较整数的同一性。相同的实例不一定相同。例如:

Integer a = new Integer(128);
Integer b = new Integer(128);
System.out.println(a == b);      // False, instances are not identical.
System.out.println(a.equals(b)); // True, instances are equal.

应该是:

o1[2].equals(o2[2])

或者,处理 o1[2]null:

Objects.equal(o1[2], o2[2])

关于java - 为什么 Comparator<Integer[]> 抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35141122/

相关文章:

Java:Java面试问题的澄清

java - 使用自定义比较器排序的集合不起作用

java - 为什么我的 Web 服务为大多数移动浏览器生成 XML 结果而不是 HTML 结果?

java - 如何在Java中减少信号重叠中的噪声?

java - 如何选择使用哪个构造函数以及Class<?>类型属于哪个类

java - 为什么我得到 "Comparison method violates its general contract"

javascript - 主干菜单未排序

java - "<T> T get()"是什么意思? (还有用吗?)

java - 谷歌眼镜示例项目正在崩溃

需要更多参数时的 c 比较器最佳实践