2013-08-25 25 views
8

我有一个ArrayList与自定义对象。它们包含一个我想排序的复选框对象。我正在使用这个比较函数对它进行排序:如何在java中使用布尔值排序ArrayLists?

我使用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

你能告诉你在哪里调用sort? – Kon

+0

您是否尝试过使用'!='而不是按位操作? –

+2

好吧,当'true,false'与'false,true'相同时,这显然不起作用。 (假设你正在进行排序以区分'true'和'false') – Zong

回答

19

您只返回-1(小于)或+1(大于),而不是0(等于)。

java.util.Comparator definition

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

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

执行者必须确保所有x和y的sgn(compare(x,y))== -sgn(compare(y, x))。 (这意味着比较(X,Y)当且仅当比较(Y,X)抛出一个异常必须抛出 例外)。

实现类还必须确保关系是可传递: ((比较( x,y)> 0)& &(比较(y,z)> 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); 
} 
+0

因为Java 1而编辑的文章。7将一个静态布尔比较器添加到类布尔值 – Aubin

+0

已将布尔值b1&b2更改为布尔值b1&b2,因为布尔值不会调用其由布尔值提供的比较函数。 – AkashG

+0

@AkashG:显式调用与Boolean.compare一起使用,此处不使用推理。请参阅http://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html#compare-boolean-boolean- – Aubin