Java 为什么使用比较器<;整数[]>;抛出异常?

Java 为什么使用比较器<;整数[]>;抛出异常?,java,comparator,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

我有个例外

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(){//arr是2D数组
公共整数比较(整数[]o1,整数[]o2){
返回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
        }
    });
Arrays.sort(arr,new Comparator(){//arr是2D数组
公共整数比较(整数[]o1,整数[]o2){
返回o1[2]。比较(o2[2]);//这是更改
}
});
不再生成异常。 我无法理解此问题的解释,因为我确信可以使用关系运算符(>,比较Integer实例。问题在于:

o1[2]==o2[2]
这是比较
整数
s的标识。相同的实例不一定相同。例如:

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])

由于您使用的是整数而不是int,因此这是无效的:

o1[2]==o2[2]?0:o1[2]>o2[2]?1:-1;

您需要使用
equals
compareTo
,而不是
=

您正在排序的数组由整数对象组成。这些对象不同于普通的旧整数

一个普通的旧整数就是内存中的一个数字

整型对象是一个类的实例,它与基本整型对象扮演相同的角色,但也有一系列与之相关的方法和数据。这就是作为一个数据块或对象的区别

=
操作符比较内存中的数字。对于对象实例,它将比较内存中的位置,而不是您想要的数字值

对于整数(和其他类似数字的)对象,必须改用
compareTo()
方法

这里的解决方案是按照建议使用
compareTo()
方法,或者将数组更改为普通的旧整数


您还可以将其保留为整数对象,然后使用
Integer.intValue()
获取返回的普通旧整数,然后您可以使用
=
比较。但这相当复杂,我认为。

整数
实例不会使用关系运算符进行比较。首先会发生隐式取消装箱。数组的内容是什么?数组之外是否有值?
o1[2]==o2[2]?0:o1[2]>o2[2]?1:-1;