Ho letto dell'ordinamento di ArrayLists usando un Comparator ma in tutti gli esempi la gente ha usato compareTo
che secondo alcune ricerche è un metodo per le stringhe.
Volevo ordinare una ArrayList di oggetti personalizzati per una delle loro proprietà: un oggetto Date
(getStartDay()
). Normalmente li confronto per item1.getStartDate().before(item2.getStartDate())
quindi mi stavo chiedendo se potevo scrivere qualcosa come:
public class CustomComparator {
public boolean compare(Object object1, Object object2) {
return object1.getStartDate().before(object2.getStartDate());
}
}
public class RandomName {
...
Collections.sort(Database.arrayList, new CustomComparator);
...
}
Poiché Date
implementa Comparable
, ha un metodo compareTo
proprio come fa String
.
Quindi il tuo Comparator
personalizzato potrebbe essere così:
public class CustomComparator implements Comparator<MyObject> {
@Override
public int compare(MyObject o1, MyObject o2) {
return o1.getStartDate().compareTo(o2.getStartDate());
}
}
Il metodo compare()
deve restituire un int
, quindi non si potrebbe restituire direttamente un booleano
come si pensava di fare.
Il tuo codice di ordinamento sarebbe proprio come hai scritto:
Collections.sort(Database.arrayList, new CustomComparator());
Un modo leggermente più breve di scrivere tutto questo, se non hai bisogno di riutilizzare il tuo comparatore, è quello di scriverlo come una classe anonima in linea:
Collections.sort(Database.arrayList, new Comparator<MyObject>() {
@Override
public int compare(MyObject o1, MyObject o2) {
return o1.getStartDate().compareTo(o2.getStartDate());
}
});
Ora puoi scrivere l'ultimo esempio in una forma più breve usando una espressione lambda per il Comparatore
:
Collections.sort(Database.arrayList,
(o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));
E List
ha un metodo sort(Comparator)
, quindi puoi accorciare ulteriormente:
Database.arrayList.sort((o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));
Questo è un idioma così comune che c'è un metodo integrato per generare un Comparator
per una classe con una chiave Comparable
:
Database.arrayList.sort(Comparator.comparing(MyObject::getStartDate));
Tutte queste sono forme equivalenti.
Sì, è possibile. Ci sono due opzioni per confrontare gli oggetti, l'interfaccia Comparable
Entrambe queste interfacce permettono un comportamento diverso. Comparable vi permette di far agire l'oggetto come avete appena descritto String (infatti, String implementa Comparable). La seconda, Comparator, vi permette di fare quello che state chiedendo di fare. Lo fareste in questo modo:
Collections.sort(myArrayList, new MyComparator());
Questo farà sì che il metodo Collections.sort usi il vostro comparatore per il suo meccanismo di ordinamento. Se gli oggetti nell'ArrayList implementano il comparatore, potete invece fare qualcosa come questo:
Collections.sort(myArrayList);
La classe Collections contiene una serie di questi utili e comuni strumenti.
la vostra classe customComparator deve implementare java.util.Comparator per essere usata. deve anche sovrascrivere compare() ed equals()
compare() deve rispondere alla domanda: L'oggetto 1 è minore, uguale o maggiore dell'oggetto 2?
documentazione completa: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Comparator.html