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

时间:2013-08-25 21:41:23

标签: java android sorting 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;
    }
}

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;
}

提案since 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 );
}