2013-08-25 8 views
8

Ich habe eine ArrayList mit benutzerdefinierten Objekten. Sie enthalten ein Checkbox-Objekt, nach dem ich sortieren möchte. Ich verwende diese Komparatorfunktion, um sie zu sortieren:Wie ArrayLists mit Booleans in Java zu sortieren?

Ich verwende den XOR-Operator, um zu überprüfen, ob sie einander gleich sind, und negieren Sie es dann.

Dies funktioniert jedoch nicht, und die Liste bleibt in der gleichen Reihenfolge.

Weiß jemand, was falsch ist?

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

Können Sie zeigen, wo Sie die Art sind nennen? – Kon

+0

Haben Sie versucht, '! =' Anstelle von bitweiser Manipulation zu verwenden? –

+2

Nun, es wird eindeutig nicht funktionieren, wenn "wahr, falsch" ist das gleiche wie "falsch, wahr". (Angenommen, Sie sortieren "true" und "false") – Zong

Antwort

19

Sie geben nur -1 (kleiner als) oder +1 (größer als) zurück, niemals 0 (entspricht).

Siehe java.util.Comparator definition:

Vergleicht seine beiden Argumente für Ordnung. Gibt eine negative Ganzzahl, Null oder eine positive ganze Zahl zurück, wenn das erste Argument kleiner als, gleich oder größer als die zweite Zahl ist.

In der vorangehenden Beschreibung die Bezeichnung sgn (Ausdruck) bezeichnet die mathematische signum-Funktion, die eine von -1 definiert ist 0 zurückzukehren, oder 1 je nachdem, ob der Wert des Ausdrucks ist negativ, Null oder positiv .

Der Implementierer muss sicherstellen, dass sgn (vergleiche (x, y)) == -sgn (vergleiche (y, x)) für alle x und y. (Dies bedeutet, dass (x, y) vergleichen, muss eine Ausnahme auslösen, wenn und nur vergleichen, wenn (y, x) eine Ausnahme auslöst.)

Der Implementierer muss auch dafür sorgen, dass die Beziehung ist transitiv: ((vergleiche (x, y)> 0) & & (vergleiche (y, z)> 0)) impliziert Vergleich (x, z)> 0.

Schließlich muss der Implementierer sicherstellen, dass vergleichen (x, y) == 0 impliziert dass sgn (vergleichen (x, z)) == sgn (vergleichen (y, z)) für alle z.

Es ist allgemein der Fall, aber nicht unbedingt erforderlich, dass (vergleiche (x, y) == 0) == (x.equals (y)). Im Allgemeinen sollte jeder Vergleicher, der diese Bedingung verletzt, diese Tatsache deutlich anzeigen. Die empfohlene Sprache ist "Hinweis: Dieser Komparator führt Ordnungen, die sind inkonsistent mit gleich."

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

Vorschlag 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

Beitrag bearbeitet wegen Java 1.7 fügt einen statischen booleschen Komparator zur Klasse hinzu. Boolean – Aubin

+0

haben boolean b1 & b2 in Boolean b1 & b2 geändert, da boolean keine Vergleichsfunktion aufruft, die von Boolean bereitgestellt wurde. – AkashG

+0

@AkashG: Expliziter Aufruf wird mit Boolean.compare verwendet, hier wird keine Inferenz verwendet. Siehe http://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html#compare-boolean-boolean- – Aubin