2015-01-17 2 views
8

Ich möchte meine ArrayList mit einem booleschen Typ zu sortieren. Grundsätzlich möchte ich Einträge zuerst mit true anzeigen. Hier ist mein Code unten:Sortieren einer ArrayList nach primitiven booleschen Typ

Abc.java

public class Abc { 
int id; 
bool isClickable; 

Abc(int i, boolean isCl){ 
    this.id = i; 
    this.isClickable = iCl; 
} 
} 

Main.java

List<Abc> abc = new ArrayList<Abc>(); 

//add entries here 

//now sort them 
Collections.sort(abc, new Comparator<Abc>(){ 
     @Override 
     public int compare(Abc abc1, Abc abc2){ 

      boolean b1 = abc1.isClickable; 
      boolean b2 = abc2.isClickable; 

      if (b1 == !b2){ 
       return 1; 
      } 
      if (!b1 == b2){ 
       return -1; 
      } 
      return 0; 
     } 
    }); 

Bestellung vor Sortierung: wahr wahr wahr falsch falsch falsch f alse wahr falsch falsch

Sortieren nach Sortierung: falsch falsch wahr wahr wahr wahr falsch falsch falsch falsch

+2

Wenn sie '==' return 0 sind. Wenn sie '! –

+2

Ihre zweite 'if'-Bedingung wird niemals zu' true 'ausgewertet. Es ist gleichbedeutend mit dem ersten. – 5gon12eder

+0

Sie müssen die Art definieren, die Sie benötigen, ist es mit der ID beteiligt? – roeygol

Antwort

3

Ein einfacher Vorschlag wäre, um das Objekt zu verwenden Boolean statt von boolean und verwenden Sie Collections.sort.

Allerdings müssen Sie wissen, dass die false vor dem true sein wird, weil wahr als 1 und falsch wie 0 vertreten sind. Aber dann könnten Sie einfach Ihren Algorithmus ändern und in umgekehrter Reihenfolge zugreifen.

Bearbeiten: Wie Seelencheck angegeben, können Sie Collections.reverseOrder verwenden, um die vom Komparator auferlegte Reihenfolge wiederherzustellen.

10

In diesem Fall ist eine der einfachsten Lösungen ist booleans auf ganze Zahlen zu konvertieren, wo false0 und true ist 1 ist. Dann gib den Unterschied zwischen dem zweiten und dem ersten zurück.

So:

 int b1 = abc1.isClickable ? 1 : 0; 
     int b2 = abc2.isClickable ? 1 : 0; 

     return b2 - b1 

sollte es tun.

4

Ich möchte die Artikel mit true Wert zuerst angezeigt werden. Meine Lösung wäre:

Collections.sort(m_mall, new Comparator<Mall>(){ 

     @Override 
     public int compare(Mall mall1, Mall mall2){ 

      boolean b1 = mall1.isClickable; 
      boolean b2 = mall2.isClickable; 

      return (b1 != b2) ? (b1) ? -1 : 1 : 0; 
     } 
    }); 
+1

mache nie Dinge wie 'if (someboolean == true)' es ist ein Code-Geruch und ist äquivalent zu 'if (someboolean)' – soulcheck

+2

das zweite verschachtelte 'if' ('if (b1 == false) {') könnte ersetzt werden mit nur 'return 1;'. – Holloway

+1

Sie haben beide Recht und der Körper des äußeren 'if' kann durch' return b1 ersetzt werden? -1: 1; ': D – Tom

23

Ein weiterer Weg zu gehen ist:

Collections.sort(abc, new Comparator<Abc>() { 
     @Override 
     public int compare(Abc abc1, Abc abc2) { 
      return Boolean.compare(abc2.isClickable,abc1.isClickable); 
     } 
    }); 
+4

Nur ein Kommentar dazu: Boolean.compare benötigt API-Stufe 19, wenn Ihre App niedrigere Ebenen unterstützt, sollten Sie die anderen Antworten verwenden, sonst ist dies gut für API 19 und höher. – ziniestro

+0

Bei absteigender Reihenfolge würde ich wahrscheinlich stattdessen '-Boolean.compare (abc1.isClickable, abc2.isClickable)' verwenden. Die Reihenfolge von abc1 und abc2 zu ändern, scheint wirklich leicht zu übersehen, was zu der Annahme führt, dass die Methode nur in aufsteigender Reihenfolge sortiert. – Dukeling

1

Java 8:

Collections.sort(abc, (abc1, abc2) -> 
        Boolean.compare(abc2.isClickable(), abc1.isClickable())); 
1

Es ist auch möglich, auf diese Weise.