Práctica 14 Criterios de ordenación y Guava Comparator, Comparable y Ordering Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Versión 1.0.1 Índice Criterio de orden natural: Comparable Criterio de orden adicional: Comparator Ordering PR14: Criterios de Comparación y Ordering Comparable comparaTo establece un orden natural para los objetos. Debe coincidir en criterio con el método equals. Valor entero devuelto: Negativo si this es menor que o Cero si this es igual a o Positivo si this es mayor que o package java.lang; public interface Comparable<T>{ int compareTo(T o); } PR14: Criterios de Comparación y Ordering 3 Comparable: propiedades compareTo: Simetría: si el resultado de comparar un objeto con otro es cero, el resultado coincide a la inversa. Transitividad: si el signo de comparar un objeto con otro coincide con el signo de comparar el segundo con un tercero, entonces también coincide con el signo de comparar el primero con el tercero. equals/compareTo: Si dos objetos son iguales, el resultado de su comparación será igual a cero, y viceversa PR14: Criterios de Comparación y Ordering 4 Ejemplo public interface Persona extends Comparable<Persona>, Copiable<Persona> { public String getNombre(); public String getApellidos(); public Integer getEdad(); …} public class PersonaImpl implements Persona { public int compareTo(Persona p){ int res=this.getApellidos().compareTo(p.getApellidos()); if (res==0) res=this.getNombre().compareTo(p.getNombre()); return res; }} ... Persona p1 = new PersonaImpl(“María”,“García”,20); Persona p2 = new PersonaImpl(“María”,“Zamorano”,20); if(p1.compareTo(p2)==0) mostrar(p1 + " y " + p2 + " no son iguales"); ... PR14: Criterios de Comparación y Ordering 5 Comparator compare establece órdenes alternativos para los objetos. Valor entero devuelto Negativo si o1 es menor que o2 Cero si los objetos o1 y o2 son iguales Positivo si o1 es mayor que o2 Es necesario implementar una nueva clase que implemente Comparator<T> package java.util; public interface Comparator<T>{ int compare(T o1, T o2); } PR14: Criterios de Comparación y Ordering 6 Comparator: propiedades Compare: Simetría: si el resultado de comparar un objeto con otro es cero, el resultado coincide a la inversa Transitividad: si el signo de comparar un objeto con otro coincide con el signo de comparar el segundo con un tercero, entonces también coincide con el signo de comparar el primero con el tercero equals/compare: Si dos objetos son iguales, el resultado de su comparación será igual a cero, y viceversa PR14: Criterios de Comparación y Ordering 7 Ejemplo Comparador de Persona por edad: public class ComparadorPersonaEdad implements Comparator<Persona> { } public int compare(Persona o1, Persona o2){ return o1.getEdad().compareTo(o2.getEdad()); } Ejemplo de uso: ... Persona p1 = new PersonaImpl(1,2); Persona p2 = new PersonaImpl(3,2); Comparator< Persona > cmp = new ComparadorPersonaEdad (); if(cmp.compare(p1,p2)==0) mostrar(p1 + " y " + p2 + " tienen la misma edad"); ... PR14: Criterios de Comparación y Ordering Ordering Clase de la librería Guava La librería se descarga de: http://code.google.com/p/guava-libraries/ PR14: Criterios de Comparación y Ordering Ordering Importar la librería: PR14: Criterios de Comparación y Ordering Ordering Importar la librería: PR14: Criterios de Comparación y Ordering Ordering Importar la librería: PR14: Criterios de Comparación y Ordering Ordering Importar la librería: PR14: Criterios de Comparación y Ordering Ordering El constructor de la clase Ordering es protegido. Construcción de objetos de tipo Ordering a partir de 3 métodos estáticos: from Comparator<Persona> c = new ComparadorPorEdad(); Ordering<Persona> ord1 = Ordering.from(c); usingToString Ordering<Persona> ord2 = Ordering.usingToString(); natural Ordering<Persona> ord3 = Ordering.natural(); PR14: Criterios de Comparación y Ordering Ordering Métodos: static <T> Ordering<T> from(Comparator<T> comparator) Devuelve un ordering para un comparator existente. static Ordering<Object> usingToString() Devuelve un ordering que compara objetos según el orden alfabético de la representación en cadena (toString) de los objetos del iterable. static <C extends Comparable> Ordering<C> natural() Devuelve un ordering en función del orden natural, es decir, del método compareTo. <E extends T> List<E> sortedCopy(Iterable<E> iterable) Devuelve una copia ordenada de un iterable dado. El orden del iterable depende del criterio de comparación asociado al objeto ordering que invoque este método. int binarySearch(List<? extends T> sortedList, T key) Devuelve la posición del element key en el iterable ordenado sortedList utilizando el algoritmo de búsqueda binaria. <S extends T> Ordering<S> nullsFirst() Devuelve un ordering que trata iterables con elementos null, de manera que éstos se consideran menores al resto de objetos, si se ordena los elementos null quedarán al principio. <S extends T> Ordering<S> nullsLast() Similar al anterior, pero los elementos null quedarán al final del iterable si este es ordenado. <E extends T> E max(Iterable<E> iterable) Devuelve el máximo del iterable de acuerdo con el criterio de ordenación asociado al objeto ordering que invoca este método. <E extends T> E min(Iterable<E> iterable) Devuelve el mínimo del iterable de acuerdo con el criterio de ordenación asociado al objeto ordering que invoca este método. PR14: Criterios de Comparación y Ordering