您仅返回 -1(小于)或 +1(大于),而不返回 0(等于)。
See the java.util.Comparator 定义 http://docs.oracle.com/javase/6/docs/api/java/util/Comparator.html#compare(T,%20T) :
比较其两个参数的顺序。返回一个负整数,
零或正整数,因为第一个参数小于、等于
到或大于第二个。
在前面的描述中,符号sgn(表达式)指定
数学符号函数,定义为返回以下之一
-1、0 或 1,具体取决于表达式的值是负数、零还是正数。
实现者必须确保 sgn(compare(x, y)) == -sgn(compare(y,
x)) 对于所有 x 和 y。 (这意味着compare(x, y)必须抛出一个
当且仅当 Compare(y, x) 抛出异常时才异常。)
实现者还必须确保关系是可传递的:
((compare(x, y)>0) && (compare(y, z)>0)) 意味着compare(x, z)>0。
最后,实现者必须确保 Compare(x, y)==0 意味着
对于所有 z 来说 sgn(compare(x, z))==sgn(compare(y, z)) 。
一般情况下是这样,但并不严格要求 (compare(x,
y)==0) == (x.equals(y))。一般来说,任何比较器
违反此条件应明确指出这一事实。这
推荐的语言是“注意:此比较器强加的顺序是
与平等不一致。”
Java 1.7之前的提案:
public int compare(ObjPerson o1, ObjPerson o2) {
boolean b1 = o1.select.isChecked();
boolean b2 = o2.select.isChecked();
if( b1 && ! b2 ) {
return +1;
}
if( ! b1 && b2 ) {
return -1;
}
return 0;
}
提议从 Java 1.7 开始 http://docs.oracle.com/javase/7/docs/api/java/lang/Boolean.html#compare%28boolean,%20boolean%29 :
public int compare(ObjPerson o1, ObjPerson o2) {
boolean b1 = o1.select.isChecked();
boolean b2 = o2.select.isChecked();
return Boolean.compare( b1, b2 );
}