2010-11-01 40 views
54

Eventuali duplicati:
Sorting an ArrayList of ContactsOrdina un ArrayList in base a un campo di oggetto

Sto immagazzinando DataNode oggetti in un ArrayList. La classe DataNode ha un campo intero chiamato degree. Desidero recuperare gli oggetti DataNode da nodeList nell'ordine crescente di degree. Come posso farlo.

List<DataNode> nodeList = new ArrayList<DataNode>(); 
+0

Eventuali duplicati di http://stackoverflow.com/questions/2784514/sort-arraylist-of-custom-objects-by-property –

+2

Su una seconda tought http : //stackoverflow.com/questions/1814095/sorting-an-arraylist-of-contacts potrebbe essere più vicino a questo –

+0

Vedere anche http://stackoverflow.com/questions/2535124/how-to-sort-an-arraylist- of-objects-by-a-property –

risposta

50

Modificare la classe DataNode in modo da implementare l'interfaccia Comparable.

public int compareTo(DataNode o) 
{ 
    return(degree - o.degree); 
} 

poi basta usare

Collections.sort(nodeList); 
+1

[Attenzione di overflow!] (Https://stackoverflow.com/q/2728793/1553851) Molto più sicuro per' return Integer.compare (this.degree, o.degree); ' – shmosel

137

Usare un comparatore personalizzato:

Collections.sort(nodeList, new Comparator<DataNode>(){ 
    public int compare(DataNode o1, DataNode o2){ 
     if(o1.degree == o2.degree) 
      return 0; 
     return o1.degree < o2.degree ? -1 : 1; 
    } 
}); 
+6

come su return (o1.degree - o2.degree) ;? – blitzkriegz

+19

Il modo corretto per farlo è il modo in cui Mark lo ha codificato. Sì, la semplice riga di codice funzionerà per il 99,9 percento delle volte. Ma si avrà un problema se il risultato della sottrazione è un numero elevato causando un overflow del bit di ordine superiore. Ad esempio ci si aspetterebbe che (Integer.MAX_VALUE - (-10)) sia postive, ma non lo è. – camickr

+0

@camickr Che dire di o1.degree.compare (o2.degree)? –

0

È possibile utilizzare il Bean Comparator per ordinare su qualsiasi proprietà nella classe personalizzata.

Problemi correlati