2015-01-17 28 views
8

Desidero ordinare il mio ArrayList utilizzando un tipo booleano. Fondamentalmente voglio mostrare le voci con true prima. Qui è il mio codice qui sotto:Ordinamento di una lista di array per tipo booleano primitivo

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; 
     } 
    }); 

ordinare prima l'ordinamento: vero vero vero falso falso falso f alse vero falso falso

dell'Ordine dopo la cernita: falso falso vero vero vero vero falso falso falso falso

+2

se sono '==' restituisce 0. Se sono '! =', Quindi utilizzare 1 o -1 in base al fatto che il primo sia vero o falso. –

+2

La tua seconda condizione 'if' non valuterà mai' true'. È sinonimo del primo. – 5gon12eder

+0

è necessario definire il tipo necessario, è coinvolto con l'id? – roeygol

risposta

3

Un semplice suggerimento sarebbe quello di utilizzare l'oggetto Boolean invece di boolean e utilizzare Collections.sort.

Tuttavia, è necessario sapere che il false sarà prima della true perché il vero sono rappresentati come 1 e falso come 0. Ma poi, puoi semplicemente modificare il tuo algoritmo e accedere in ordine inverso.

Edit: Come soulscheck ha dichiarato, è possibile utilizzare Collections.reverseOrder per ripristinare l'ordine imposto dal comparatore.

10

In questo caso una delle soluzioni più semplici è quello di convertire in interi booleani, dove false è 0 e true è 1. Quindi restituisci la differenza tra la seconda e la prima.

Quindi:

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

     return b2 - b1 

dovrebbe farlo.

4

Desidero visualizzare gli articoli con il valore true. La mia soluzione sarebbe:

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

mai fare cose come 'if (someboolean == true)' è un odore di codice ed è equivalente a 'if (someboolean)' – soulcheck

+2

il secondo annidato 'if' ('if (b1 == false) {') potrebbe essere sostituito con solo 'return 1;'. – Holloway

+1

Hai entrambi ragione e il corpo del 'if' esterno può essere sostituito con' return b1? -1: 1; ': D – Tom

23

Un'altra strada da percorrere è:

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

Solo un commento al riguardo: Boolean.compare richiede il livello API 19 se la tua app supporta livelli inferiori dovresti usare le altre risposte, altrimenti è un vantaggio per API 19 e versioni successive. – ziniestro

+0

Per ordine decrescente, preferirei utilizzare '-Boolean.compare (abc1.isClickable, abc2.isClickable)'. Cambiare l'ordine di abc1 e abc2 sembra davvero facile da perdere, portando a pensare che il metodo sia solo in ordine ascendente. – Dukeling

1

Java 8:

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

E 'anche possibile che modo.

myList.sort((a, b) -> Boolean.compare(a.isSn_Principal(), b.isSn_Principal())); 
Problemi correlati