logo

Comparable vs Comparador a Java

Java proporciona dues interfícies per ordenar objectes utilitzant els membres de dades de la classe:

  1. Comparable
  2. Comparador

Utilitzant una interfície comparable



Un objecte comparable és capaç de comparar-se amb un altre objecte. La pròpia classe ha d'implementar el java.lang.Comparable interfície per comparar les seves instàncies.
Penseu en una classe de pel·lícules que tingui membres com, classificació, nom, any. Suposem que volem ordenar una llista de pel·lícules en funció de l'any d'estrena. Podem implementar la interfície Comparable amb la classe Movie i substituïm el mètode compareTo() de la interfície Comparable.

Java








// 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());> >}> >}> }>

>

>

Sortida

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>

Ara, suposem que també volem ordenar les pel·lícules per la seva classificació i noms. Quan fem comparable un element de col·lecció (en fer-lo implementar Comparable), només tenim una oportunitat d'implementar el mètode compareTo(). La solució és utilitzar Comparador.

Ús del comparador

A diferència de Comparable, Comparator és extern al tipus d'element que estem comparant. És una classe a part. Creem diverses classes separades (que implementen Comparator) per comparar per diferents membres.
La classe de col·leccions té un segon mètode sort() i necessita Comparator. El mètode sort() invoca compare() per ordenar objectes.

Per comparar pel·lícules per classificació, hem de fer 3 coses:

  1. Creeu una classe que implementi Comparator (i per tant el mètode compare() que fa el treball fet anteriorment per compareTo()).
  2. Feu una instància de la classe Comparator.
  3. Truqueu al mètode sort() sobrecarregat, donant-li tant la llista com la instància de la classe que implementa Comparator.

Java


lloc web com coomeet



// 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()) retorna 1; sinó retorna 0; } } // Classe per comparar Pel·lícules per nom class NameCompare implementa Comparador { public int compare(Movie m1, Movie m2) { return m1.getName().compareTo(m2.getName()); } } // Classe del controlador 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( nova pel·lícula('Empire Strikes Back', 8.8, 1980)); list.add( nova pel·lícula('El retorn del Jedi', 8.4, 1983)); // Ordena per puntuació : (1) Crea un objecte de // puntuacióCompara // (2) Truca a Col·leccions.sort // (3) Imprimeix la llista ordenada System.out.println('Ordenada per puntuació'); RatingCompare ratingCompare = nou RatingCompare(); Collections.sort(llista, classificacióComparar); per (pel·lícula: llista) System.out.println(movie.getRating() + ' ' + movie.getName() + ' ' + movie.getYear()); // Crida al mètode d'ordenació sobrecarregat amb RatingCompare // (Els tres passos anteriors) System.out.println(' Ordenat per nom'); NameCompare nameCompare = new NameCompare(); Collections.sort(llista, nomCompare); per a (pel·lícula: llista) System.out.println(movie.getName() + ' ' + movie.getRating() + ' ' + movie.getYear()); // Utilitza Comparable per ordenar per any System.out.println(' Ordenat per any'); Col·leccions.sort(llista); per (pel·lícula: llista) System.out.println(movie.getYear() + ' ' + movie.getRating() + ' ' + movie.getName() + ' '); } }>>>

> 

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>
  • Comparable està pensat per a objectes amb ordenació natural, el que significa que l'objecte en si ha de saber com s'ha d'ordenar. Per exemple, els números de rotlle dels estudiants. Mentre que, l'ordenació de la interfície Comparator es fa mitjançant una classe separada.
  • Lògicament, la interfície Comparable compara aquesta referència amb l'objecte especificat i Comparator en Java compara dos objectes de classe diferents proporcionats.
  • Si alguna classe implementa una interfície comparable a Java, la col·lecció d'aquest objecte, ja sigui List o Array, es pot ordenar automàticament mitjançant el mètode Collections.sort() o Arrays.sort() i els objectes s'ordenaran segons l'ordre natural definit pel mètode CompareTo.
  • Una característica diferenciadora bàsica és que utilitzant comparables només podem utilitzar una comparació. Mentre que, podem escriure més d'un comparador personalitzat com vulgueu per a un tipus determinat, tot fent servir diferents interpretacions del que significa l'ordenació. Com en l'exemple comparable, podríem ordenar només per un atribut, és a dir, l'any, però al comparador també vam poder utilitzar diferents atributs com la qualificació, el nom i l'any.

En resum, si l'ordenació d'objectes s'ha de basar en l'ordre natural, utilitzeu Comparable, mentre que si l'ordenació s'ha de fer en atributs d'objectes diferents, feu servir Comparador a Java.