Che andbin non me ne voglia, scrivo giusto per dire qualcosa in più su queste 2 interfacce
Esiste una sostanziale differenza fra "Comparable" e "Comparator", differenza che si evince già dal nome: la prima indica la
capacità di un oggetto essere comparato (una sorta di "ordinamento naturale"), mentre la seconda indica la
capacità di un oggetto di comparare altri oggetti.
Quindi, sempre in riferimento all'agenda, se la classe "Contatto" implementa l'interfaccia "Comparable" (e di conseguenza implementa il metodo "compareTo(Contact other)") allora si sta definendo il modo naturale attraverso il quale è possibile ordinarne le istanze: ad esempio possiamo ritenere naturale un ordinamento alfabetico crescente (a-z) in cui si confronta prima il nome e poi, in caso di omonimia, il cognome.
Allo stesso tempo, però, potrebbero esserci dei casi in cui magari può farti comodo ordinare i contatti sulla base del numero di telefono (supponiamo che questa cosa abbia un'utilità ). Per questo motivo è possibile definire un'altra classe, ad esempio "ContactSortByPhoneComparator", che implementa l'interfaccia "Comparator<Contact>" e il relativo metodo "compare(Contact c1, Contact c2)", attraverso il quale è possibile effettuare un ordinamento diverso da quello "naturale" (il quale, se esiste, viene ignorato).
Quindi per ordinare una lista di oggetti "Comparable" in modo naturale puoi usare il metodo statico
Collections.sort(lista);
mentre per ordinare la stessa lista tramite il "Comparator":
Collections.sort(lista, comparator);