2013-08-25 13 views
8

Özel nesnelerle bir ArrayList'im var. Sıralamak istediğim bir onay kutusu nesnesi içeriyor. Bu karşılaştırıcı işlevi kullanıyorum:ArrayLists java'da booleans kullanarak nasıl sıralanır?

Birbirlerine eşit olup olmadığını kontrol etmek için XOR operatörünü kullanıyorum, sonra da onu reddediyorum.

Ancak bu çalışmıyor ve liste aynı sırada kalıyor.

Neyin yanlış olduğunu bilen var mı?

public class CustomSelectSort implements Comparator<ObjPerson> { 
    @Override 
    public int compare(ObjPerson o1, ObjPerson o2) { 
     return !(o1.select.isChecked()^o2.select.isChecked()) ? 1 : -1; 
    } 
} 
+0

sen gösterebilir misin? – Kon

+0

Biten manipülasyon yerine '! =' Kullanmayı denediniz mi? –

+2

Doğru, yanlış “yanlış, doğru” ile aynı olduğunda işe yaramaz. ("True" ve "false" sözcüklerini ayırmak için sıralama yaptığınızı varsayarak) – Zong

cevap

19

Yalnızca -1 (az) veya +1 (büyük), asla 0 (eşittir).

java.util.Comparator definition bakınız:

sipariş için onun iki argüman karşılaştırır. Negatif bir tamsayı, sıfır veya ilk bağımsız değişken 0'dan küçük, eşit veya daha büyük bir pozitif tamsayı döndürür. Yukarıdaki tarifte

, gösterim SGN (ifade) tanımlanır matematiksel sinyalnum işlevi, ifade değeri negatif sıfır veya pozitif olmasına göre -1 biri 0 ya da 1 dönmek belirtmektedir . Uygulayıcı, tüm x ve y için sgn (karşılaştırın (x, y)) == -sgn (karşılaştırın (y, x)) olduğundan emin olmalıdır. (Bu durum, karşılaştırma halinde ve (y, x) bir istisna atar, bir özel durum gerekir (x, y) karşılaştırın ifade eder.)

implementor de ilişki geçişli olduğundan emin olmak gerekir: ((karşılaştırma (x, y)> 0) & & (karşılaştırın (y, z)> 0)), (x, z)> 0 değerlerini karşılaştırır. Son olarak, uygulayıcı, (x, y) == 0 değerlerinin, tüm z için sgn (karsılastır (x, z)) == sgn (karsılastır (y, z)) değerini olarak işaret ettiğinden emin olmalıdır.

Bu genellikle bir durumdur, ancak kesinlikle gerekli değildir (karşılaştırın (x, y) == 0) == (x.equals (y)). Genel olarak, 'un bu koşulu ihlal ettiği herhangi bir karşılaştırıcı, bu gerçeği açıkça belirtmelidir. önerilen dil "Not: bu karşılaştırıcı, öğesinin eşittir ile tutarlı olmadığı siparişleri uygular." since 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; 
} 

Öneri:

Öneri

Java 1.7 önce sıralama aradığınız nerede

public int compare(ObjPerson o1, ObjPerson o2) { 
    boolean b1 = o1.select.isChecked(); 
    boolean b2 = o2.select.isChecked(); 
    return Boolean.compare(b1, b2); 
} 
+0

Yayınlama, çünkü Java 1.boolean değil çağırır karşılaştırmak onun Boole tarafından sağlanmıştır işlev yapar beri 7, Boole b1 & b2 için boolean b1 ve b2 değişti – Aubin

+0

Boole sınıfa statik boolean karşılaştırıcı ekler. – AkashG

+0

@AkashG: Açık çağrı Boolean.compare, burada kullanılan hiçbir çıkarım birlikte kullanılır. http://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html#compare-boolean-boolean- – Aubin