Java fornisce due interfacce per ordinare gli oggetti utilizzando i membri dati della classe:
diagramma delle classi Java
- Paragonabile
- Comparatore
Utilizzando un'interfaccia comparabile
Un oggetto comparabile è capace di confrontarsi con un altro oggetto. La classe stessa deve implementare il file java.lang.Comparable interfaccia per confrontare le sue istanze.
Considera un corso di film con membri come, valutazione, nome, anno. Supponiamo di voler ordinare un elenco di film in base all'anno di uscita. Possiamo implementare l'interfaccia Comparable con la classe Movie e sovrascrivere il metodo compareTo() dell'interfaccia Comparable.
Giava
// A Java program to demonstrate use of Comparable> import> java.io.*;> import> java.util.*;> // A class 'Movie' that implements Comparable> class> Movie>implements> Comparable> {> >private> double> rating;> >private> String name;> >private> int> year;> >// Used to sort movies by year> >public> int> compareTo(Movie m)> >{> >return> this>.year - m.year;> >}> >// Constructor> >public> Movie(String nm,>double> rt,>int> yr)> >{> >this>.name = nm;> >this>.rating = rt;> >this>.year = yr;> >}> >// Getter methods for accessing private data> >public> double> getRating() {>return> rating; }> >public> String getName() {>return> name; }> >public> int> getYear() {>return> year; }> }> // Driver class> class> Main> {> >public> static> void> main(String[] args)> >{> >ArrayList list =>new> ArrayList();> >list.add(>new> Movie(>'Force Awakens'>,>8.3>,>2015>));> >list.add(>new> Movie(>'Star Wars'>,>8.7>,>1977>));> >list.add(>new> Movie(>'Empire Strikes Back'>,>8.8>,>1980>));> >list.add(>new> Movie(>'Return of the Jedi'>,>8.4>,>1983>));> >Collections.sort(list);> >System.out.println(>'Movies after sorting : '>);> >for> (Movie movie: list)> >{> >System.out.println(movie.getName() +>' '> +> >movie.getRating() +>' '> +> >movie.getYear());> >}> >}> }> |
>
L'attrice Sai Pallavi
>Produzione
Movies after sorting : Star Wars 8.7 1977 Empire Strikes Back 8.8 1980 Return of the Jedi 8.4 1983 Force Awakens 8.3 2015>
Supponiamo ora di voler ordinare i film anche in base alla classificazione e ai nomi. Quando rendiamo comparabile un elemento di una raccolta (facendogli implementare Comparable), abbiamo solo una possibilità di implementare il metodo compareTo(). La soluzione sta usando Comparatore.
Utilizzo del comparatore
A differenza di Comparable, Comparator è esterno al tipo di elemento che stiamo confrontando. È una classe separata. Creiamo più classi separate (che implementano Comparator) per confrontare membri diversi.
La classe Collections ha un secondo metodo sort() e accetta Comparator. Il metodo sort() richiama compare() per ordinare gli oggetti.
Per confrontare i film in base alla valutazione, dobbiamo fare 3 cose:
str a intero
- Crea una classe che implementi Comparator (e quindi il metodo compare() che esegue il lavoro precedentemente svolto da compareTo()).
- Crea un'istanza della classe Comparator.
- Chiama il metodo sort() sovraccaricato, fornendogli sia l'elenco che l'istanza della classe che implementa Comparator.
Giava
porzione dell'array Java
// A Java program to demonstrate Comparator interface> import> java.io.*;> import> java.util.*;> // A class 'Movie' that implements Comparable> class> Movie>implements> Comparable {> >private> double> rating;> >private> String name;> >private> int> year;> >// Used to sort movies by year> >public> int> compareTo(Movie m)> >{> >return> this>.year - m.year;> >}> >// Constructor> >public> Movie(String nm,>double> rt,>int> yr)> >{> >this>.name = nm;> >this>.rating = rt;> >this>.year = yr;> >}> >// Getter methods for accessing private data> >public> double> getRating() {>return> rating; }> >public> String getName() {>return> name; }> >public> int> getYear() {>return> year; }> }> // Class to compare Movies by ratings> class> RatingCompare>implements> Comparator {> >public> int> compare(Movie m1, Movie m2)> >{> >if> (m1.getRating() return -1; if (m1.getRating()>m2.getRating()) restituisce 1; altrimenti restituisce 0; } } // Classe per confrontare i film per nome class NameCompare implementa Comparator { public int compare(Movie m1, Movie m2) { return m1.getName().compareTo(m2.getName()); } } // Classe driver class Main { public static void main(String[] args) { ArrayList list = new ArrayList(); list.add(nuovo film('Il Risveglio della Forza', 8.3, 2015)); list.add(nuovo film('Star Wars', 8.7, 1977)); list.add( nuovo film('L'Impero colpisce ancora', 8.8, 1980)); list.add( nuovo film('Il ritorno dello Jedi', 8.4, 1983)); // Ordina per voto: (1) Crea un oggetto di // ratingCompare // (2) Chiama Collections.sort // (3) Stampa l'elenco ordinato System.out.println('Ordinato per voto'); RatingCompare ratingCompare = new RatingCompare(); Collections.sort(list, ratingCompare); for (Film film: elenco) System.out.println(movie.getRating() + ' ' + movie.getName() + ' ' + movie.getYear()); // Chiama il metodo di ordinamento sovraccarico con RatingCompare // (Stessi tre passaggi di cui sopra) System.out.println('
Ordinato per nome'); NameCompare nameCompare = new NameCompare(); Collections.sort(list, nameCompare); for (Film film: elenco) System.out.println(movie.getName() + ' ' + movie.getRating() + ' ' + movie.getYear()); // Utilizza Comparable per ordinare per anno System.out.println('
Ordinato per anno'); Collezioni.sort(lista); for (Film film: elenco) System.out.println(movie.getYear() + ' ' + movie.getRating() + ' ' + movie.getName() + ' '); } }> |
>
porzione dell'array Java
>
Produzione:
Sorted by rating 8.3 Force Awakens 2015 8.4 Return of the Jedi 1983 8.7 Star Wars 1977 8.8 Empire Strikes Back 1980 Sorted by name Empire Strikes Back 8.8 1980 Force Awakens 8.3 2015 Return of the Jedi 8.4 1983 Star Wars 8.7 1977 Sorted by year 1977 8.7 Star Wars 1980 8.8 Empire Strikes Back 1983 8.4 Return of the Jedi 2015 8.3 Force Awakens>
- Paragonabile è pensato per oggetti con ordinamento naturale, il che significa che l'oggetto stesso deve sapere come deve essere ordinato. Ad esempio, elenca i numeri degli studenti. Invece, l'ordinamento dell'interfaccia del comparatore viene eseguito tramite una classe separata.
- Logicamente, l'interfaccia Comparable confronta questo riferimento con l'oggetto specificato e Comparator in Java confronta due diversi oggetti di classe forniti.
- Se una classe implementa l'interfaccia Comparable in Java, la raccolta di quell'oggetto List o Array può essere ordinata automaticamente utilizzando il metodo Collections.sort() o Arrays.sort() e gli oggetti verranno ordinati in base all'ordine naturale definito dal metodo CompareTo.
- Una caratteristica fondamentale di differenziazione è che utilizzando i comparabili possiamo utilizzare un solo confronto. Invece, possiamo scrivere più di un comparatore personalizzato che desideri per un dato tipo, tutti utilizzando interpretazioni diverse del significato di ordinamento. Come nell'esempio comparabile, potremmo semplicemente ordinare in base a un solo attributo, ovvero l'anno, ma nel comparatore siamo stati in grado di utilizzare anche attributi diversi come valutazione, nome e anno.
Per riassumere, se l'ordinamento degli oggetti deve essere basato sull'ordine naturale, utilizzare Comparable mentre se l'ordinamento deve essere eseguito su attributi di oggetti diversi, utilizzare Comparator in Java.