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:
|
1 |
int compareTo(Object o) |
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.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public class Main { public static void main(String[] args) { // crear una coleccion clasifique los objetos --> TreeSet Set arbol = new TreeSet(); arbol.add(new Cliente("Juan", 1500, "12345678-A")); arbol.add(new Cliente("Jose", 1200, "1245778-A")); arbol.add(new Cliente("Maria", 1800, "2222222-A")); arbol.add(new Cliente("Laura", 1100, "88888888-A")); Object[] array = arbol.toArray(); for (int i=0; i<array.length; i++){ System.out.println((Cliente)array[i]); } } } |
Ahora veamos la clase con la implementación Comparable con el método compareTo(Object o)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
package compararobjetos; public class Cliente implements Comparable{ String nombre; double cifraVentas; String nif; @Override public int compareTo(Object o) { Cliente otroCliente = null; int resultado = 0; if (o instanceof Cliente){ otroCliente = (Cliente) o; // ClassCastException } // 0 --> los objetos son iguales if (cifraVentas == otroCliente.cifraVentas){ resultado = 0; } // 1 --> es mayor else if(cifraVentas > otroCliente.cifraVentas) { resultado = 1; } // -1 --> es menor else if(cifraVentas < otroCliente.cifraVentas) { resultado = -1; } return resultado; } public Cliente(String nombre, double cifraVentas, String nif) { this.nombre = nombre; this.cifraVentas = cifraVentas; this.nif = nif; } @Override public String toString() { return "Cliente{" + " nombre=" + nombre + " cifraVentas=" + cifraVentas + " nif=" + nif + '}'; } } |
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:
|
1 |
int compare(Object o1, Object o2) |
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.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
ackage comparator; public class ClienteSimple{ private String nombre; private double cifraVentas; private String nif; public ClienteSimple() { // TODO Auto-generated constructor stub } public ClienteSimple(String nombre, double cifraVentas, String nif) { this.nombre = nombre; this.cifraVentas = cifraVentas; this.nif = nif; } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } public double getCifraVentas() { return cifraVentas; } public void setCifraVentas(double cifraVentas) { this.cifraVentas = cifraVentas; } public String getNif() { return nif; } public void setNif(String nif) { this.nif = nif; } @Override public String toString() { return "Cliente{ " + "nombre=" + nombre + " cifraVentas=" + cifraVentas + " nif=" + nif + '}'; } } |
Generamos un comparador en una clase aparte. En este caso para ordenar por nombre.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
package comparator; import java.util.Comparator; public class ComparadorNombre implements Comparator{ @Override public int compare(Object o1, Object o2) { return (((ClienteSimple)o1).getNombre().compareTo(((ClienteSimple)o2).getNombre()) ); } } |
También nos podemos generar otro comparador para ordenar por el nif.
|
1 2 3 4 5 6 7 8 9 10 11 12 |
package comparator; import java.util.Comparator; public class ComparadorNif implements Comparator{ @Override public int compare(Object o1, Object o2) { return (((ClienteSimple)o1).getNif().compareTo(((ClienteSimple)o2).getNif()) ); } } |
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:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
package comparator; import java.util.Comparator; import java.util.TreeSet; import compararobjetos.*; public class Main { public static void main(String[] args) { // crear una coleccion clasifique los objetos --> TreeSet ComparadorNombre c = new ComparadorNombre(); ComparadorNif nif = new ComparadorNif(); // Elegimos ordenar los clientes por su nombre //TreeSet arbol = new TreeSet(c); TreeSet arbol = new TreeSet(nif); arbol.add(new ClienteSimple("Juan", 1500, "1111-A")); arbol.add(new ClienteSimple("Jose", 1200, "3333-B")); arbol.add(new ClienteSimple("Maria", 1800, "2222-C")); arbol.add(new ClienteSimple("Laura", 1100, "0000-D")); Object[] array = arbol.toArray(); for (int i = 0; i < array.length; i++) { System.out.println((ClienteSimple) array[i]); } } } |