我有一个带有自定义对象的ArrayList。它们包含我要排序的复选框对象。我正在使用这个比较器函数对它进行排序:
我正在使用XOR运算符来检查它们是否彼此相等,然后否定它。
然而,这不起作用,并且列表保持相同的顺序。
有谁知道什么是错的?
public class CustomSelectSort implements Comparator<ObjPerson> {
@Override
public int compare(ObjPerson o1, ObjPerson o2) {
return !(o1.select.isChecked() ^ o2.select.isChecked()) ? 1 : -1;
}
}
答案 0 :(得分:19)
您只返回-1(小于)或+1(大于),从不返回0(等于)。
请参阅java.util.Comparator definition:
比较其订单的两个参数。返回一个负整数, 零或正整数,因为第一个参数小于,等于 到,或大于第二个。
在前面的描述中,符号sgn(表达式)表示 数学符号函数,定义为返回其中之一 -1,0或1根据表达式的值是负数,零还是正数。
实现者必须确保sgn(compare(x,y))== -sgn(比较(y, x))所有x和y。 (这意味着compare(x,y)必须抛出一个 异常,当且仅当compare(y,x)抛出异常时。)
实现者还必须确保关系是可传递的: ((compare(x,y)&gt; 0)&amp;&amp;(compare(y,z)&gt; 0))暗示比较(x,z)> 0。
最后,实现者必须确保compare(x,y)== 0暗示 所有z的sgn(compare(x,z))== sgn(compare(y,z))。
通常情况如此,但并非严格要求(比较(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;
}
public int compare(ObjPerson o1, ObjPerson o2) {
boolean b1 = o1.select.isChecked();
boolean b2 = o2.select.isChecked();
return Boolean.compare( b1, b2 );
}