7.4 Comparadores
En Java hay dos mecanismos para cambiar la forma en la que los elementos se ordenan.
Imagina que tienes los artículos almacenados en una lista llamada articulos, y que cada artículo se almacena en la siguiente clase Articulo (fíjate que el código de artículo es una cadena y no un número):
4.1. Comparator¶
La primera forma de ordenar consiste en crear una clase que implemente la interfaz java.util.Comparator, y por ende, el método compare definido en dicha interfaz. Esto se explicó en el apartado de conjuntos, al explicar el TreeSet, así que no vamos a profundizar en ello. No obstante, el comparador para ese caso podría ser así:
Una vez creada esta clase, ordenar los elementos es muy sencillo; simplemente se pasa como segundo parámetro del método sort una instancia del comparador creado:
4.2. Comparable¶
La segunda forma es, quizás, más sencilla cuando se trata de objetos cuya ordenación no existe de forma natural, pero requiere modificar la clase (en el ejemplo la clase Articulo). Consiste en hacer que los objetos que se insertan en la lista o array implementen la interfaz java.util.Comparable. Todos los objetos que implementan la interfaz Comparable son "ordenables" y se puede invocar el método sort sin indicar un comparador para ordenarlos. La interfaz Comparable solo requiere implementar el método compareTo:
Del ejemplo anterior se pueden resaltar dos cosas importantes:
1) que la interfaz Comparable es genérica y que para que funcione sin problemas es conveniente indicar el tipo base sobre el que se permite la comparación (en este caso, el objeto Articulo debe compararse consigo mismo), y
2) que el método compareTo solo admite un parámetro, dado que comparará el objeto con el que se pasa por parámetro.
El funcionamiento del método compareTo es el mismo que el método compare de la interfaz Comparator:
- si la clase que se pasa por parámetro es igual al objeto, se tendría que retornar 0;
- si es menor o anterior, se debería retornar un número menor que cero;
- si es mayor o posterior, se debería retornar un número mayor que 0.
Ordenar ahora la lista de artículos es sencillo, fíjate que fácil:
Ejemplo 4.01: Consulta el siguient código
Ejercicio resuelto Comparator1. Imagínate que Objeto es una clase como la siguiente:
TreeSet, estos se tienen que ordenar de forma que la suma de sus atributos (a y b) sea descendente, ¿como sería el comparador?
Respuesta
Una de las posibles soluciones a este problema podría ser la siguiente:
Y para usarlo tendriamos:
Ejemplo 4.02: Consulta el siguient código
Ejercicio resuelto Comparator2. Ahora convertiremos la clase Objeto para que directamente implemente la interfaz Comparable:
Y lo usamos directamente en la clase Principal:
Fíjate que la salida sigue mostrando los elementos correctamente ordenados, aunque se insertaron de manera "aleatoria":