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
6new Comparator<Student>() {
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);
}