jdk 1.7 排序问题 Collections.sort(list, new Comparator()

shadow-liu 2019-04-22 12:46:01

import java.util.*;

/**
* @author :Liu Gui Jie
* @date :Created in 2019-04-22 12:34:21
* @description:
*/
public class Test {

public static void main(String[] args) {
//环境jdk 1.7
//几率报错

List<Integer> list = new ArrayList<>();

for (int a = 1; a < 500; a++) {
list.add(new Random().nextInt());
}

for (int a = 1; a < 10000; a++) {
Collections.sort(list, new Comparator<Integer>() {

// Comparator的实现必须保证以下几点(出自这儿):
// 1). sgn(compare(x, y)) == -sgn(compare(y, x))
// 2). (compare(x, y)>0) && (compare(y, z)>0) 意味着 compare(x, z)>0
// 3). compare(x, y)==0 意味着对于任意的z:sgn(compare(x, z))==sgn(compare(y, z)) 均成立
@Override
public int compare(Integer x, Integer y) {
//问题出现在这里 正确写法知道,想知道这个 x-y 为啥报错
// x > y ? 1 : -1 违反第一条
// x - y 违反了上面哪一条?
return x - y;
}
});
}
}

}


这个是运行时候报错,并不是每次都会出现,几率的。
Connected to the target VM, address: '127.0.0.1:49373', transport: 'socket'
Exception in thread "main" 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:410)
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 java.util.Collections.sort(Collections.java:217)
at com.Test.main(Test.java:23)
Disconnected from the target VM, address: '127.0.0.1:49373', transport: 'socket'

Process finished with exit code 1


return x - y; 违反了上面哪一条?

在线上出问题的时候我在网上看到解决办法
System.setProperty("java.util.Arrays.useLegacyMergeSort", "true");
为了快速解决线上报错,就无脑的在线上项目加入这行代码。
...全文
884 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
大金毛子 2019-04-23
  • 打赏
  • 举报
回复
不要用x-y吧,用compare
qq_39936465 2019-04-22
  • 打赏
  • 举报
回复
引用 4 楼 qq_26934073 的回复:
list<integer> 是我拿来做测试的。x-y不越界的情况请也会报错。我上面程序没有越界 多运行几次就会报错。
你上面的程序会越界的 我下面测试是可以的 list.add(new Random().nextInt(10000000));
shadow-liu 2019-04-22
  • 打赏
  • 举报
回复
引用 2 楼 qq_39936465 的回复:
[quote=引用 楼主 qq_26934073 的回复:] 在线上出问题的时候我在网上看到解决办法 System.setProperty("java.util.Arrays.useLegacyMergeSort", "true"); 为了快速解决线上报错,就无脑的在线上项目加入这行代码。
return x - y; 你的x-y可能超出int的取值范围判断出错。list<integer>比较可以直接用Collections.sort(list); [/quote] list<integer> 是我拿来做测试的。x-y不越界的情况请也会报错。我上面程序没有越界 多运行几次就会报错。
shadow-liu 2019-04-22
  • 打赏
  • 举报
回复
引用 1 楼 qybao 的回复:
如果考虑到范围越界,违反第一条吧 打印一下试试 System.out.println(0-(Integer.MAX_VALUE+1)); System.out.println((Integer.MAX_VALUE+1)-0);
可以运行我上面的程序 在不越界的情况下 还是几率报错
qq_39936465 2019-04-22
  • 打赏
  • 举报
回复
引用 楼主 qq_26934073 的回复:
在线上出问题的时候我在网上看到解决办法 System.setProperty("java.util.Arrays.useLegacyMergeSort", "true"); 为了快速解决线上报错,就无脑的在线上项目加入这行代码。
return x - y; 你的x-y可能超出int的取值范围判断出错。list<integer>比较可以直接用Collections.sort(list);
qybao 2019-04-22
  • 打赏
  • 举报
回复
如果考虑到范围越界,违反第一条吧
打印一下试试
System.out.println(0-(Integer.MAX_VALUE+1));
System.out.println((Integer.MAX_VALUE+1)-0);

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧