Ordenar colecciones

Cuando  mencionamos  el  concepto  ordenar  colecciones  nos  estamos  refiriendo  a mantener  los elementos  clasificados  dentro  de la colección,  por ejemplo, alfabéticamente, cronológicamente, ascendente, …etc.

Para lograr este objetivo utilizamos las interfaces Comparable y Comparator.

 

INTERFACE  COMPARABLE

La interface Comparable permite definir el orden natural de los elementos. Ejemplos de clases que implementan dicha interface son:

  • String; En los elementos de este tipo se define un orden alfabético.
  • Date; En los elementos de este tipo se define un orden cronológico
  • Integer; En los elementos de este tipo se define un orden numérico

La interface Comparable define un único método:

Este método lo debemos implementar y el valor entero a devolver tendrá el siguiente significado:

  • 0; si los objetos a comparar son iguales
  • 1; si la instancia en la cual estamos  es mayor  que  el objeto  pasado  como argumento.
  • -1; si la instancia en la cual estamos  es menor que el objeto pasado  como argumento.

En el siguiente ejemplo, vemos que queremos ordenar las instancias de tipo Cliente atendiendo a su cifra de ventas.

Ahora veamos la clase con la implementación Comparable con el método compareTo(Object o)

Para mantener los elementos ordenados necesitamos una colección que implemente la  interface  SortedSet  que  como  vimos  antes  son  las  únicas  que  permiten  este propósito.

INTERFACE  COMPARATOR

Al implementar la interface Comparable en la clase Cliente, estamos dando por hecho que todos los objetos Cliente siempre los vamos a ordenar por su cifra de ventas.

Ahora bien. Y si resulta que unas veces quiero ordenarlos por el nombre y otras veces por el nif por ejemplo. La solución nos la aporta la interface Comparator.

La interface Comparator define un único método:

También devolvemos un numero entero con el mismo significado que antes.

  • 0; si los objetos a comparar son iguales
  • 1; si el primer objeto es mayor que el segundo.
  • -1; si el primer objeto es menor que el segundo.

Veamos un ejemplo: Ahora la clase Cliente no implementa ninguna interface.

 

Generamos  un  comparador  en  una  clase  aparte.  En  este  caso  para  ordenar  por nombre.

También nos podemos generar otro comparador para ordenar por el nif.

A la hora de crear la colección que nos permite tener ordenados los objetos, debemos pasarle una instancia del comparador elegido. Esto especifica si queremos ordenar los elementos por el nombre o por el nif. Veamos como:

Descargar código ejemplos.