debug_mode=ON

Buscar en

 
 

Interfaces Comparator y Comparable (y III)

Escrito por ocell hace 1 años bajo una licencia de Creative Commons Creative Commons License
2248 visitas. Etiquetas: good-practices, java, comparation, comparator, interface

Ya hace más de dos meses que debería haber publicado este post pero como sabeis el tiempo es un bien escaso y entre unas cosas y otras no he podido preparar el código hasta ahora.

Bueno al código! En esta última parte utilizaremos el interfaz Comparator para crear clases específicas para ordenar. Siguiendo el hilo de los anteriores posts he creado una clase para ordenar Personas por edad y otra para ordenar por altura. Por si solas no tendrían mucho sentido pero al implementar Comparator podremos utilizarlas para fijar la ordenación en diferentes estructuras de datos como vectores, listas, etc.

La primera clase es OrdenarPersonaPorEdad y al implementar Comparator hay que implementar (o sobrecargar :-P) los métodos compare(...) y equals(...). Sobre este último comentar que según la documentación de *Sun* habría que comprobar que realmente los criterios de comparación son los mismos. Pero en la práctica únicamente se comprueba que se está utilizando el mismo objeto; this y obj hacen referencia al mismo objeto.

Como en la clase Persona se utilizó Integer para la edad y la altura, ahora únicamente deberemos utilizar el métode compareTo(..) de Integer, lo que simplifica el diseño y el ejemplo.

import java.util.Comparator;

public class OrdenarPersonaPorEdad implements Comparator {
    /**
      * Return a negative integer,
      * zero, or a positive integer as
      * this object is less than, equal to,
      * or greater than the specified object.
      */
    public int compare(Persona p1, Persona p2) {
        return p1.getEdad().compareTo(p2.getEdad());
    }

    public boolean equals(Object obj) {
        return this == obj;
    }
}

Aquí podemos ver el código para la clase que comparará por altura. Como apunte, si recordamos la segunda parte del artículo, dónde se multiplicaba por -1 el resultado de compareTo(..) para devolver el orden inverso, aquí podríamos utilizarlo de la misma forma.

import java.util.Comparator;

public class OrdenarPersonaPorAltura implements Comparator {
    /**
      * Return a negative integer,
      * zero, or a positive integer as
      * this object is less than, equal to,
      * or greater than the specified object.
      */
    public int compare(Persona p1, Persona p2) {
        return p1.getAltura().compareTo(p2.getAltura());
    } 

    public boolean equals(Object obj) {
        return this == obj;
    }
}

Y como el código de la clase para probar los dos comparadores con un Vector.

import java.util.Vector;
import java.util.Iterator;
import java.util.Collections;

public class Test {
    /**
      * Main para probar la clase.
      */
    public static void main(String[] args) {
        // Franc
        Persona franc = new Persona("Franc", 38, 1.77);
        // Rosa
        Persona rosa = new Persona("Rosa", 29, 1.98);
        // Maite
        Persona maite = new Persona("Maite", 37, 1.78);

        // Creo una comunidad de personas.
        Vector miComunidad = new Vector();
        miComunidad.add(franc);
        miComunidad.add(rosa);
        miComunidad.add(maite);

        // Ordeno por edad la comunidad de personas.
        Collections.sort(miComunidad, new OrdenarPersonaPorEdad());

        // Ya se puede listar la comunidad ordenada por edad.
        Iterator personaIter = miComunidad.iterator();
        System.out.println("Comunidad ordenada por edad.");
        while (personaIter.hasNext())
        System.out.println(personaIter.next());

        // Ordeno por altura la comunidad de personas.
        Collections.sort(miComunidad, new OrdenarPersonaPorAltura());

        // Ya se puede listar la comunidad ordenada por altura.
        personaIter = miComunidad.iterator();
        System.out.println("Comunidad ordenada por altura.");
        while (personaIter.hasNext())
        System.out.println(personaIter.next());
    }
}

Resultado de la ejecución:
Comunidad ordenada por edad.
*Me llamo Rosa, tengo 29 y mi altura es 1.98
Me llamo Maite, tengo 37 y mi altura es 1.78
Me llamo Franc, tengo 38 y mi altura es 1.77*

Comunidad ordenada por altura.
*Me llamo Franc, tengo 38 y mi altura es 1.77
Me llamo Maite, tengo 37 y mi altura es 1.78
Me llamo Rosa, tengo 29 y mi altura es 1.98*

Como podéis ver el uso de Comparator simplifica en muchas ocasiones la tarea de ordenar un Vector (por ejemplo). Tener presente este interfaz, así como el interfaz Comparable, a la hora de diseñar una aplicación puede ahorrar mucho código y simplificar futuras modificaciones, mejoras, etc.

Espero que esta serie de artículos sobre los interfaces de comparación que ofrece Java os halla gustado y os ayude en el futuro.

 

¡Votalo! 3 votos
¡Compártelo!

        

&nbps;

&nbps;

ocell

Sobre ocell

Este usuario no ha completado su perfil.

 
Regístrate o haz login para participar.
¿Todavía no conoces debugmodeon?
debugmodeon es la red social para profesionales de la informática
descubre debugmodeon
 

2 comentarios en "Interfaces Comparator y Comparable (y III)"

sr-71blajarEdwuin
sr-71blajarEdwuin escribió
hace 1 años

#1   

una pregunta hermano yo descargue netbeans para windows pero cuando lo comienzo a instalar me aparece una ventana que me dice que el fabricante no es conocido y no me instala el programa conoces algun enlace que me lo descargue sin ese tipo de problemas gracias a tus estan muy buenos

 

ocell
ocell escribió
hace 1 años

#2   

El mejor sitio para descargarlo es desde la web oficial de Netbeans http://www.netbeans.org/ es la única que te recomiendo. Sobre tu problema, lo siento yo utilizo Eclipse y estoy muy poco familiarizado con Netbeans.

Editado 1 veces. La última vez hace hace 1 años.

 
 
 
 

© Copyright 2008-2009 debug_mode=ON | Aviso legal | Contacto | FAQ | ¿Quiénes somos? |