Java proporciona dos interfaces para ordenar objetos utilizando miembros de datos de la clase:
ventanas.abrir javascript
- Comparable
- Comparador
Usando una interfaz comparable
Un objeto comparable es capaz de compararse con otro objeto. La clase misma debe implementar el java.lang.Comparable interfaz para comparar sus instancias.
Considere una clase de Película que tenga miembros como clasificación, nombre y año. Supongamos que deseamos ordenar una lista de películas según el año de lanzamiento. Podemos implementar la interfaz Comparable con la clase Movie y anulamos el método compareTo() de la interfaz 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());> >}> >}> }> |
>
>Producción
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>
Ahora, supongamos que queremos ordenar las películas por clasificación y nombre también. Cuando hacemos que un elemento de colección sea comparable (haciendo que implemente Comparable), solo tenemos una oportunidad de implementar el método compareTo(). La solución es usar Comparador.
Usando el comparador
A diferencia de Comparable, Comparator es externo al tipo de elemento que estamos comparando. Es una clase separada. Creamos múltiples clases separadas (que implementan Comparador) para comparar entre diferentes miembros.
La clase Colecciones tiene un segundo método sort() y requiere Comparador. El método sort() invoca compare() para ordenar objetos.
Para comparar películas por clasificación, debemos hacer 3 cosas:
- Cree una clase que implemente Comparator (y, por lo tanto, el método compare() que realiza el trabajo realizado anteriormente por compareTo()).
- Cree una instancia de la clase Comparador.
- Llame al método sort() sobrecargado, proporcionándole tanto la lista como la instancia de la clase que implementa Comparator.
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()) devuelve 1; de lo contrario, devuelve 0; } } // Clase para comparar películas por nombre class NameCompare implements Comparator { public int compare(Movie m1, Movie m2) { return m1.getName().compareTo(m2.getName()); } } // Clase de controlador class Main { public static void main(String[] args) { ArrayList lista = new ArrayList(); list.add(nueva película('El despertar de la fuerza', 8.3, 2015)); list.add(nueva película('Star Wars', 8.7, 1977)); list.add( nueva película('El imperio contraataca', 8.8, 1980)); list.add( nueva película('El regreso del Jedi', 8.4, 1983)); // Ordenar por calificación: (1) Crear un objeto de // calificaciónCompare // (2) Llamar a Collections.sort // (3) Imprimir lista ordenada System.out.println('Ordenar por calificación'); ClasificaciónCompare clasificaciónCompare = nueva ClasificaciónCompare(); Colecciones.sort(lista, calificaciónComparar); for (Película película: lista) System.out.println(movie.getRating() + ' ' + movie.getName() + ' ' + movie.getYear()); // Llama al método de clasificación sobrecargado con RatingCompare // (Los mismos tres pasos anteriores) System.out.println('
Ordenado por nombre'); NombreCompare nombreCompare = nuevo NombreCompare(); Colecciones.sort(lista, nombreComparar); for (Película película: lista) System.out.println(movie.getName() + ' ' + movie.getRating() + ' ' + movie.getYear()); // Utiliza Comparable para ordenar por año System.out.println('
Ordenado por año'); Colecciones.sort(lista); for (Película película: lista) System.out.println(movie.getYear() + ' ' + movie.getRating() + ' ' + movie.getName() + ' '); } }> |
>
>
Producción:
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á destinado a objetos con ordenamiento natural, lo que significa que el objeto mismo debe saber cómo debe ordenarse. Por ejemplo, números de lista de estudiantes. Mientras que la clasificación de la interfaz Comparator se realiza a través de una clase separada.
- Lógicamente, la interfaz Comparable compara esta referencia con el objeto especificado y Comparator en Java compara dos objetos de clases diferentes proporcionados.
- Si alguna clase implementa la interfaz Comparable en Java, la colección de ese objeto, ya sea List o Array, se puede ordenar automáticamente utilizando el método Collections.sort() o Arrays.sort() y los objetos se ordenarán según el orden natural definido por el método CompareTo.
- Una característica diferenciadora básica es que al utilizar comparables solo podemos utilizar una comparación. Mientras que podemos escribir más de un comparador personalizado según lo desee para un tipo determinado, todos utilizando diferentes interpretaciones de lo que significa ordenar. Como en el ejemplo comparable, pudimos ordenar por un solo atributo, es decir, año, pero en el comparador también pudimos usar diferentes atributos como calificación, nombre y año.
En resumen, si la clasificación de objetos debe basarse en el orden natural, utilice Comparable, mientras que si la clasificación debe realizarse según atributos de diferentes objetos, utilice Comparador en Java.