首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Comparator<Integer[]>抛出异常?

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

Stack Overflow用户
提问于 2016-02-01 21:55:13
回答 3查看 269关注 0票数 0

我有个例外

代码语言:javascript
复制
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)

使用此代码时:

代码语言:javascript
复制
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;
        }
    });

我认为这与比较的传递性不令人满意有关,但当我做出这样的小小改变时:

代码语言:javascript
复制
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实例

代码语言:javascript
复制
Integer x = 1;
Integer y = 2;
System.out.println(x<y);

打印结果与预期一致

有谁能澄清吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-02-01 22:00:38

问题是:

代码语言:javascript
复制
o1[2]==o2[2]

这是比较Integer的标识。平等的实例不一定是相同的。例如:

代码语言:javascript
复制
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.

它应该是:

代码语言:javascript
复制
o1[2].equals(o2[2])

或者,处理o1[2]null

代码语言:javascript
复制
Objects.equal(o1[2], o2[2])
票数 7
EN

Stack Overflow用户

发布于 2016-02-01 22:00:49

由于您使用的是Integer而不是int,所以这是无效的:

代码语言:javascript
复制
o1[2]==o2[2]?0:o1[2]>o2[2]?1:-1;

您需要使用equalscompareTo,而不是==

票数 1
EN

Stack Overflow用户

发布于 2016-02-01 22:13:39

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

一个普通的旧整数只是一个位于内存中的数字。

integer对象是一个类的实例,它填充与基本整数相同的角色,但也有一组与其相关的方法和数据。这就是数据块和对象之间的区别。

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

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35141122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档