sábado, 4 de febrero de 2012

Comparator en Java

votar
   A veces en tu programa necesitas comparar varios elementos, por ejemplo para ordenarlos. En Java hay diversas formas de hacer esto, como usando Comparable, que ordena los elementos según su orden natural (de menor a mayor o alfabéticamente) o usando Comparator, en el que tú especificas la forma en la que quieres que sean ordenados.


   Hoy vamos a ver este último método con un ejemplo muy sencillo. Vamos a usar un array de alumnos y lo vamos a ordenar según sus notas y sus nombres. Podríamos hacerlo con cualquier tipo de colecciones y genéricos, y también simplificarlo para que el código fuese más corto, pero hemos decidido hacerlo así para que podáis ver bien todo el proceso. Notad también que igualmente podríamos haber utilizado Comparable en este código.



import java.util.*;
class Alumnos{
   private int nota;
   private String nombre;
   public void setNota(int nota){
      this.nota = nota;
   }
   public int getNota( ){
      return this.nota;
   }
   public void setNombre(String nombre){
      this.nombre = nombre;
   }
   public String getNombre( ){
      return this.nombre;
   }
}
class ComparaNota implements Comparator{/**hay que implementar la interfazComparator y definir el método compare()*/
   public int compare (Object alum1, Object alum2){
      int alum1Nota = ((Alumnos)alum1).getNota( );//hacemos un casting
      int alum2Nota = ((Alumnos)alum2).getNota( );
      if(alum1Nota > alum2Nota){//ordenamos de mayor a menor
         return -1;
      }else if(alum1Nota < alum2Nota){
         return 1;
      }else{
         return 0;
      }
   }
}
class ComparaNombre implements Comparator{
   public int compare(Object alum1, Object alum2){
      String alum1Nombre = ((Alumnos) alum1).getNombre( );
      String alum2Nombre = ((Alumnos) alum2).getNombre( );
      return alum1Nombre.compareTo(alum2Nombre);/**usamos el método compareTo para un orden  alfabético*/         
   }
}
public class EjemploComparatorJava{//creamos el array y le añadimos valores
   public static void main(String[ ] args){
      Alumnos alumnos[ ] = new Alumnos[3];
      alumnos[0] = new Alumnos( );
      alumnos[0].setNota(8);
      alumnos[0].setNombre("Ana");
      alumnos[1] = new Alumnos( );
      alumnos[1].setNota(6);
      alumnos[1].setNombre("Xose");
      alumnos[2] = new Alumnos( );
      alumnos[2].setNota(3);
      alumnos[2].setNombre("Carlos");
      System.out.println("Alumnos desordenados");
      for(int i = 0; i<alumnos.length;i++){
         System.out.println("Alumno "+(i+1)+" Nombre: "+alumnos[i].getNombre( )+" Nota: "+alumnos[i].getNota( ));
      }
      Arrays.sort(alumnos, new ComparaNota( ));/**usamos el método sort para ordenar las notas*/
      System.out.println("Alumnos ordenados por notas");
      for(int i = 0; i<alumnos.length; i++){
         System.out.println("Alumno "+(i+1)+" Nombre: "+alumnos[i].getNombre( )+" Nota: "+alumnos[i].getNota( ));
      }
      Arrays.sort(alumnos, new ComparaNombre( ));/**ahora ordenamos los nombres*/
      System.out.println("Alumnos ordenados por nombre");
      for(int i = 0;i<alumnos.length; i++){
         System.out.println("Alumno "+(i+1)+" Nombre:     "+alumnos[i].getNombre( )+" Nota: "+alumnos[i].getNota( ));
      }
   }
}



   La salida será como sigue:


Alumnos desordenados
Alumno 1 Nombre: Ana Nota: 8
Alumno 2 Nombre: Xose Nota: 6
Alumno 3 Nombre: Carlos Nota: 3
Alumnos ordenados por notas
Alumno 1 Nombre: Ana Nota: 8
Alumno 2 Nombre: Xose Nota: 6
Alumno 3 Nombre: Carlos Nota: 3
Alumnos ordenados por nombres
Alumno 1 Nombre: Ana Nota: 8
Alumno 2 Nombre: Carlos Nota: 3
Alumno 3 Nombre: Xose Nota: 6


   Si al ordenarlos por notas hubiésemos decidido hacerlo de menor a mayor (basta con cambiar el signo de los unos) el orden hubiese sido Carlos, Xose, Ana.


   Os animamos a que practiquéis con este código, probando con distintas variantes, para que veáis que es muy sencillo.

3 comentarios: