mark9 ha scritto:
Sono alle prese con queste due interfacce. Ho trovato alcuni esempi in rete ma ancora non mi è tanto chiaro il loro utilizzo, qualcuno potrebbe farmi due semplici esempi e spiegarmi le differenze?
Le due interfacce hanno il metodo di comparazione che è un po' diverso come forma. Ma la differenza più importante è relativa a DOVE devono essere implementate.
Comparable va implementato
nella classe degli oggetti da comparare. Se hai una classe es. Persona e vuoi che sia Comparable, allora si fa:
public class Persona implements Comparable<Persona> {
// ....
public int compareTo(Persona altraPersona) {
// .....
}
}
Dal momento che Comparable è in Persona, se ne può avere uno solo di Comparable. Questo è il criterio di ordinamente che dovrebbe essere quello "naturale" degli oggetti. Per oggetti Persona il criterio più noto e naturale è per cognome e poi per nome.
Comparator va implementato in classi esterne e pertanto ne puoi avere quante ne vuoi per definire qualunque altro criterio particolare.
public class NomeAnnoNascitaPersonaComparator implements Comparator<Persona> {
public int compare(Persona persona1, Persona persona2) {
// ....
}
}
public class AnnoNascitaSessoPersonaComparator implements Comparator<Persona> { ...... }
ecc...
Poi quando vuoi ordinare una lista di Persona:
Collections.sort(listaPersone); // usa implicitamente Comparable degli oggetti stessi
Collections.sort(listaPersone, unTuoComparator); // usa un Comparator esplicito
(da Java 8 le liste hanno il sort() che riceve un Comparator)