Ir al contenido principal

Interfaz Comparator. Comparadores en Java

Cuando trabajamos con las colecciones en Java a veces necesitamos ordenar primero los elementos para luego realizar una determinada acción. 

Si trabajamos con objetos o tipos simples como números (java.lang.Number, int) o cadenas (java.lang.String) la ordenación es más fácil. Para ordenar un array de este tipo lo único que tenemos que hacer es utilizar la sentencia siguiente y ya tendríamos nuestro array ordenado:


java.util.Arrays.sort(arrayDeNumeros); 

Pero imaginemos ahora que tenemos que realizar una determinada acción sobre un tipo complejo (Persona, Departamento...). Si queremos ordenar un array de objetos complejos debemos decir primero qué criterios de ordenación se deben seguir. ¿Cómo se hace esto? Pues con la interfaz java.util.Comparator.

Hay dos opciones: implementar la interfaz Comparator en la propia clase del objeto que queremos ordenar o bien hacerlo en una clase diferente. La opción más elegante es la segunda, tener clases diferentes que implementen la interfaz Comparator por cada método de ordenación que queremos definir.

Por ejemplo, imaginemos que tenemos una clase llamada Numero que representa los números posibles de un sorteo de lotería. A veces queremos ordenar la lista de números del sorteo por el valor del propio número y otras veces queremos ordenar la lista por la probabilidad con la que hayamos calculado que puede aparecer el número en un sorteo.

El código de la clase Numero es el siguiente:


public class Numero {

 private int numero;

 private int valor;

 private float probabilidad;

 private int numeroSorteos;

 private int tipoItem;

 private float peso;

 private String anillo;

 /**
  * @param numero
  * @param valor
  * @param probabilidad
  * @param numeroSorteos
  * @param tipoItem
  * @param peso
  * @param anillo
  */
 public Numero(int numero, int valor, float probabilidad, int numeroSorteos,
   int tipoItem, int peso, String anillo) {
  this.numero = numero;
  this.valor = valor;
  this.probabilidad = probabilidad;
  this.numeroSorteos = numeroSorteos;
  this.tipoItem = tipoItem;
  this.peso = peso;
  this.anillo = anillo;
 }

 public Numero() {

 }

 public int getNumero() {
  return numero;
 }

 public void setNumero(int numero) {
  this.numero = numero;
 }

 public int getValor() {
  return valor;
 }

 public void setValor(int valor) {
  this.valor = valor;
 }

 public float getProbabilidad() {
  return probabilidad;
 }

 public void setProbabilidad(float probabilidad) {
  this.probabilidad = probabilidad;
 }

 public int getNumeroSorteos() {
  return numeroSorteos;
 }

 public void setNumeroSorteos(int numeroSorteos) {
  this.numeroSorteos = numeroSorteos;
 }

 public int getTipoItem() {
  return tipoItem;
 }

 public void setTipoItem(int tipoItem) {
  this.tipoItem = tipoItem;
 }

 public float getPeso() {
  return peso;
 }

 public void setPeso(float peso) {
  this.peso = peso;
 }

 public String getAnillo() {
  return anillo;
 }

 public void setAnillo(String anillo) {
  this.anillo = anillo;
 }

 @Override
 public boolean equals(Object obj) {
  if (obj == null)
   return false;

  if (!(obj instanceof Numero)) {
   return false;
  }

  Numero item = (Numero) obj;
  if (this.numero == item.numero) {
   return true;
  }
  return false;

 }

 @Override
 public int hashCode() {
  // TODO Auto-generated method stub
  return this.numero;
 }

}


Para crear el comparador que ordena los números por su valor nos creamos una clase que implemente Comparator y sobrescriba el método compare(Object,Object). Este método devuelve un número negativo, cero o un número positivo si el primer argumento es menor, igual o mayor que el segundo argumento. Para ordenar tendremos en cuenta al atributo valor.

El código lo tenéis aquí:


class ItemComparator implements Comparator {

 public void ItemComparator() {
 }

 public int compare(Object arg0, Object arg1) {
  Integer item1 = ((Numero) arg0).getValor();
  Integer item2 = ((Numero) arg1).getValor();  
  return item1.compareTo(item2);
 }

}


Para crear el comparador que nos ordenará la lista de números por probabilidad haremos lo mismo pero esta vez lo que haremos será sobrescribir el método compare(Object,Object) ordenando por el atributo probabilidad.


El código lo tenéis aquí:


class ProbabilidadComparator implements Comparator {
 public ProbabilidadComparator() {

 }

 public int compare(Object arg0, Object arg1) {  
  Float item1 = ((Numero) arg0).getProbabilidad();
  Float item2 = ((Numero) arg1).getProbabilidad();  
  return item1.compareTo(item2);
 }

}

Por último, para hacer la ordenación de nuestro array le pasaremos al método sort de la clase java.util.Arrays la implementación de la clase Comparator que queramos, dependiendo del criterio de ordenación que queramos utilizar. 

En el siguiente código ordenamos el array por probabilidad:




...
Arrays.sort(n, new ProbabilidadComparator());
...


Como siempre, espero haberos ayudado con vuestros programas en Java.


Salu2.

Comentarios

  1. Este comentario ha sido eliminado por un administrador del blog.

    ResponderEliminar

Publicar un comentario

Entradas populares de este blog

Soluciones Alchemy Classic 389 elementos

Hace algún tiempo salió una actualización del Juego Alchemy Classic en la que aparecían más elementos (389 en lugar de 238). Aparte de añadir elementos mejoran algunas traducciones en castellano y mejoran la interfaz, aunque todavía hay algún error en algunos nombres de elementos. Aquí os dejo las soluciones para los que estén atascados y no puedan dormir por las noches: Sustancia primaria Aire=Elemento primario  Fuego=Elemento primario  Agua=Elemento primario  Tierra=Sustancia Primaria Arena=Piedra + Aire Piedra=Tierra + Fuego Arcilla=Arena + Pantano Caliza=Tierra + Amonitas Carbono=Fuego + Madera Cloro=Fuego + Sal + Electricidad CO2(Dióxido de Carbono)=Ceniza + Ácido nítrico Electricidad=Relámpago+ Metales Gas natural= Yacimiento de gas + Pozo Helio=Refinería de gas + Gas Natural Hidrógeno=Electricidad + Agua Hielo=Frío + Agua Imán=Piedra + Metales Metano=Deshechos Vegetales + Pantano Oxígeno=Electricidad + Agua Petróleo=Unidad

JAXB: Leer y escribir ficheros XML

Muchas veces en nuestras aplicaciones debemos manejar documentos XML ( Extensible Markup Language ). Este lenguaje se ha convertido en un estándar para intercambio de datos entre programas y aplicaciones a través de Internet. En un esquema XML (o  XSD ) podemos definir los elementos que pueden aparecer en un documento XML así como las relaciones entre los mismos. JAXB ( Java Architecture for XML Binding ) es un estándar Java para transformar un esquema XML (o  XSD ) en una representación a objetos java. Mediante la API de JAXB podemos mapear un objeto Java a un documento XML ( "marshall" ) y el proceso contrario, es decir, a partir de un esquema XML crear su conjunto de objeto Java asociado ( "unmarshall" ). JAXB Resumiendo lo que nos proporciona JAXB es: Generación de objetos Java a partir de un XSD a través de un compilador Proporciona capacidades de marshall/unmarshall (escribir fichero XML desde java y al contrario) Integración con Maven a través de xj

Matemáticas y cine.

El otro día estaba viendo por la televisión una película llamada 21 blackjack . En una escena de la película el profesor de matemáticas ( Kevin Spacey ) le presenta a uno de sus alumnos la siguiente situación: se encuentra en un concurso en la que debe escoger entre tres puertas (1,2 y 3). En dos de ellas hay una cabra, sin embargo en una de las 3 hay un flamante coche nuevo. El alumno responde que quiere abrir la puerta. El presentador, conocedor de lo que hay detrás de cada puerta decide abrir otra puerta diferente mostrando detrás de ella una cabra. El profesor se dirige al alumno y le pregunta, ¿cambiarías la puerta o te quedarías con la puerta que tienes? Muchos de nosotros cambiaríamos de puerta pensando que es una treta del presentador para engañarnos. ¿Cual elegiríais vosotros? Al comienzo tenemos 1/3 de probabilidades de acertar la puerta donde está el coche. Una vez que el presentador abre la puerta con una cabra, la mayoría de gente piensa que hay la misma probabilidad de