En el ejemplo de Calculo del número máximo y mínimo de un conjunto veíamos que el algoritmo de cálculo implementado por el FrameWork de las colecciones confiaba en que el tipo de dato utilizado en el conjunto tenía implementado la función compareTo. Lo cual sucede en los tipos de datos básicos.
Esto no implica que aquellos tipos de datos que no lo implementen dicho método no puedan utilizar las funciones del FrameWork.
Además de las funciones…
.max(conjunto)
.min(conjunto)
Tenemos otras dos…
.max(conjunto, comparator)
.min(conjunto, comparator)
Estas operaciones sirven para decirle al algoritmo: dame el máximo y mínimo elemento del conjunto y utiliza el objeto comparator que es el que sabe comparar los elementos del conjunto.
La verdad es que hablar del objeto comparator es algo erroneo, ya que Comparator es un Interface. Dicho interface nos especifica los métodos que hay que implementar para que dos elementos puedan ordenarse.
Dos son los métodos del Interface Comparator…
int compare(Object o1, Object o2)
boolean equals(Object obj)
Deberemos de implementar estos métodos en una clase, la cual, será la que pasemos como parámetro a las funciones de máximo y de mínimo.
Para nuestro ejemplo supongamos que partimos de la clase Persona que será de la siguiente forma….
Class Persona {
int iEdad;
String sNombre;
}
El objeto compare deberá saber como comparar dos personas. El método devolverá un número positivo si la primera persona es menor que la segunda, cero si las personas son iguales y un número negativo si la segunda persona es mayor que la primera.
Asumimos que comparamos a las personas por su edad, quedándonos la siguiente implementación del método compare…
Comparator comparador = new Comparator(){
public int compare(Persona p1, Persona p2) {
return (p1.getEdad()-p2.getEdad());
}
};
Por último bastará con pasarle el comparador a las funciones de mínimo y máximo.
System.out.println(Collections.max(hs2,comparador).getNombre());
System.out.println(Collections.min(hs2,comparador).getNombre());