2013-08-25 11 views
8

Mam ArrayList z niestandardowymi obiektami. Zawierają one obiekt wyboru, który chcę posortować. Używam tej funkcji komparatora, aby ją posortować:Jak sortować ArrayLists za pomocą wartości logicznych w java?

Używam operatora XOR, aby sprawdzić, czy są one sobie równe, a następnie je negować.

Jednak to nie działa, a lista pozostaje w tej samej kolejności.

Czy ktoś wie, co jest nie tak?

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

można pokazać, gdzie dzwonisz sortowania? – Kon

+0

Czy próbowałeś użyć '! =' Zamiast manipulacji bitowej? –

+2

Cóż, najwyraźniej nie zadziała, gdy "true, false" jest tym samym, co "false, true". (Zakładając, że sortujesz, aby oddzielić "true" i "false") – Zong

Odpowiedz

19

Powracasz tylko -1 (mniej niż) lub +1 (więcej niż), nigdy 0 (równa się).

Zobacz java.util.Comparator definition:

porównuje swoje dwa argumenty na zamówienie. Zwraca ujemną liczbę całkowitą, zero lub dodatnią liczbę całkowitą, ponieważ pierwszy argument jest mniejszy niż, równy lub większy niż drugi.

W powyższym opisie, notacja sgn (ekspresji) oznacza matematyczna funkcja signum, która jest określona, ​​aby powrócić jedną -1, 0 lub 1, zależnie od tego czy wartość wyrażenia jest ujemne, zerowe lub dodatnie .

Wykonawca musi zapewnić, że sgn (porównaj (x, y)) == -sgn (porównaj (y, x)) dla wszystkich x i y. (Oznacza to, że porównanie (x, y) należy wyjątek, wtedy i tylko wtedy, gdy porównanie (y, x) zgłasza wyjątek.)

implementor musi zapewnić, że związek jest przechodni: ((porównaj (x, y)> 0) & & (porównaj (y, z)> 0)) oznacza porównanie (x, z)> 0.

Wreszcie, implementor musi upewnić się, że porównanie (x, y) == 0 implikuje , że sgn (porównaj (x, z)) == sgn (porównaj (y, z)) dla wszystkich z.

Jest to na ogół przypadek, ale nie jest to bezwzględnie wymagane (porównaj (x, y) == 0) == (x.równania (y)). Ogólnie rzecz biorąc, dowolny komparator, który narusza ten warunek, powinien wyraźnie wskazywać na ten fakt. Zalecanym językiem jest "Uwaga: ten komparator nakłada zamówienia, które są niespójne z równymi."

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

Wniosek 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

Post edytowany, ponieważ Java 1.7 dodaje statyczny komparator boolowski do klasy Boolean – Aubin

+0

zmieniono boolean b1 i b2 na Boolean b1 i b2, ponieważ boolean nie wywołuje funkcji porównania, którą dostarczył Boolean. – AkashG

+0

@AkashG: Wywołanie jawne jest używane z Boolean.compare, tutaj nie użyto żadnej zależności. Zobacz http://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html#compare-boolean-boolean- – Aubin

Powiązane problemy