Java Collection Sort之IllegalArgumentException

java.lang.IllegalArgumentException: Comparison method violates its general contract!

在 JDK 7 版本以上, Comparator 要满足自反性,传递性,对称性,不然Arrays.sort、Collections.sort会报 IllegalArgumentException 异常。

说明:
1 ) 自反性: x , y 的比较结果和 y , x 的比较结果相反。
2 ) 传递性: x > y , y > z ,则 x > z 。
3 ) 对称性: x = y ,则 x , z 比较结果和 y , z 比较结果相同。

反例:

下例中没有处理相等的情况,实际使用中可能会出现异常

1
2
3
4
5
6
new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getId() > o2.getId() ? 1 : -1;
}
}

正例:

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* 基于某种 Comparable 接口实现一个关键码类,并将所有通常的比较方法封装起来,以支持关键码之间的比较。
*/
public interface Comparator {
/**
* 若a>(=或<)b,返回正数、零或负数
*
* @param a
* @param b
* @return
*/
public int compare(Object a, Object b);
}

------ 本文结束------

本文标题:Java Collection Sort之IllegalArgumentException

文章作者:Perkins

发布时间:2019年08月22日

原始链接:https://perkins4j2.github.io/posts/63757/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。