2013-08-25 24 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