2015-02-19 9 views
8

Ho una lista di oggetti ordinati per un parametro di data e voglio riordinarli per parametro di categoria, ma mantenendo l'ordine di data all'interno della categoria.Collections.sort conserva l'ordine su elementi uguali?

È qualcosa del genere abbastanza o devo implementare un comparatore che prende in considerazione la data per gli oggetti della stessa categoria?

// sort the list by category asc(, date asc) 
Collections.sort((List<Object>)entries, new Comparator<Object>() { 

    @Override public int compare(Object elementA, Object elementB) { 
     return elementA.category.compareTo(elementB.category); // what happens when elementA.category.equals(elementB.category)? 
    } 

}); 
+1

IMO se hai bisogno di ordinare per qualcosa, ordinare per qualcosa - non lasciarlo al caso, o il risultato di un altro tipo. –

+0

'Collections.sort' usa' Arrays.sort' dietro le quinte, che fa un ordinamento di fusione. Il codice di quell'ordinamento di fusione è [qui] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Arrays.java#Arrays.mergeSort % 28java.lang.Object% 5B% 5D% 2Cjava.lang.Object% 5B% 5D% 2Cint% 2Cint% 2Cint% 29). – Voicu

+2

È sempre una buona idea leggere il Javadoc per un metodo, prima di chiedere su Stack Overflow esattamente come funziona il metodo. In questo caso particolare, Javadoc risponde alla tua domanda molto, molto chiaramente. –

risposta

14

Il codice nella tua domanda farà quello che avete bisogno di, dal momento che fa Collections.sort() preservare l'ordine di elementi uguali.

Dal documentation:

Questo tipo è garantito per essere stabili: elementi uguali non saranno riordinate come risultato del genere.

In altre parole, se le voci sono ordinate per data prima della sort(), rimarranno ordinati per data di all'interno di ciascuna categoria dopo la sort().

Se non si desidera fare affidamento sull'ordinamento originale, è possibile estendere facilmente il comparatore per confrontare prima le categorie e quindi interrompere i legami utilizzando le date.

Problemi correlati