如何在java中使用布尔值对ArrayLists进行排序?

ome*_*ega 8 java sorting android arraylist

我有一个带有自定义对象的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Aub*_*bin 19

您只返回-1(小于)或+1(大于),从不返回0(等于).

请参阅java.util.Comparator定义:

比较它的两个参数的顺序.返回负整数,零或正整数,因为第一个参数小于,等于或大于第二个参数.

在前面的描述中,符号sgn(表达式)指定数学符号函数,其被定义为根据表达式的值是负,零还是正来返回-1,0或1中的一个.

实现者必须确保所有x和y的sgn(compare(x,y))== -sgn(compare(y,x)).(这意味着当且仅当compare(y,x)抛出异常时,compare(x,y)必须抛出异常.)

实现者还必须确保关系是传递的:((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)).一般来说,任何违反此条件的比较器都应清楚地表明这一事实.推荐的语言是"注意:这个比较器强加了与equals不一致的排序."

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;
}
Run Code Online (Sandbox Code Playgroud)

自Java 1.7以来的提案:

public int compare(ObjPerson o1, ObjPerson o2) {
   boolean b1 = o1.select.isChecked();
   boolean b2 = o2.select.isChecked();
   return Boolean.compare( b1, b2 );
}
Run Code Online (Sandbox Code Playgroud)