tutorial - ordenar listas java

5

Click here to load reader

Upload: abimael-desales-lopez

Post on 21-Jan-2018

317 views

Category:

Software


1 download

TRANSCRIPT

Page 1: Tutorial   - Ordenar listas Java

TUTORIAL ORDENAR LISTAS

¿Alguna vez te has visto en la necesidad de ordenar una colección, como lo es una lista (List) y no

sabes cómo?

Existen muchos ejemplos en internet, pero aquí lo ilustraremos de la forma más sencilla posible,

ordenar un ArrayList de objetos por sus propiedades, lo cual se hace a través de las interfaces Comparable y Comparator.

Generalmente usamos el método Collections.sort() para ordenar un arraylist sencillo. Sin

embargo, si tu ArrayList es de un tipo de objeto personalizado, en ese caso tienes dos opciones para

ordenar, el uso de las interfaces comparable y comparator. Antes de ver el ejemplo, veamos cuál es

la salida cuando intentamos ordenar un arraylist de Objects sin implementar alguna de estas intefaces.

¿Por qué necesitamos de Comparable y Comparator?

Considera el siguiente ejemplo – tengo la clase Trabajador que tiene propiedades como nombre del

trabajador, apellidos, número de nómina y fecha de nacimiento.

public class Trabajador { private String nombreTrabajador; private String apPaternoTrabajador; private String apMaternoTrabajador; private int nomina; public Trabajador(int nomina, String nombreTrabajador, String apPaternoTrabajador, String apMaternoTrabajador) { this.nomina = nomina; this.nombreTrabajador = nombreTrabajador; this.apPaternoTrabajador = apPaternoTrabajador; this.apMaternoTrabajador = apMaternoTrabajador; } public String getNombreTrabajador() { return nombreTrabajador; } public void setNombreTrabajador(String nombreTrabajador) { this.nombreTrabajador = nombreTrabajador; } public String getApPaternoTrabajador() { return apPaternoTrabajador; } public void setApPaternoTrabajador(String apPaternoTrabajador) { this.apPaternoTrabajador = apPaternoTrabajador; } public String getApMaternoTrabajador() { return apMaternoTrabajador; } public void setApMaternoTrabajador(String apMaternoTrabajador) { this.apMaternoTrabajador = apMaternoTrabajador; } public int getNomina() { return nomina;

Page 2: Tutorial   - Ordenar listas Java

} public void setNomina(int nomina) { this.nomina = nomina; } }

Y quiero tener un ArrayList of Student Object. We do it like this –

import java.util.*; public class ArrayListSorting { public static void main(String args[]){ ArrayList<Trabajador> arraylist = new ArrayList<Trabajador>(); arraylist.add(new Trabajador(23, "Lourdes", "Ríos", "Carás")); arraylist.add(new Trabajador(387, "Raul", "Ríos", "Carás")); arraylist.add(new Trabajador(98, "Benito", "Bodoque", "del Campo")); Collections.sort(arraylist); for(Trabajador str: arraylist){ System.out.println(str); } } }

Intenté llamar a Collections.sort() en la Lista de Objects y obtuve un mensaje de error como

este – Exception in thread “main” java.lang.Error: Unresolved compilation problem: Bound mismatch: The generic method sort(List) of type Collections is not applicable for the arguments (ArrayList). The inferred type Trabajador is not a valid substitute for the bounded parameter > at ArrayListSorting.main(ArrayListSorting.java:11)

Razón: Llamé al método sort en una ArrayList de Objects que realmente no funciona a menos que

uses interfaces como Comparable y Comparator.

Ahora debes haber comprendido la importancia de estas interfaces. Veamos cómo usarlas.

Ordenamiento de ArrayList<Object> con Comparable

Digamos que necesitamos ordenar el ArrayList<Trabajador> basado en la propiedad Apellido del

Trabajador. Así es como puede hacerse – Primero implementar la interface Comparable y luego

sobrescribir el método compareTo.

public class Trabajador implements Comparable { private String nombreTrabajador; private String apPaternoTrabajador;

Page 3: Tutorial   - Ordenar listas Java

private String apMaternoTrabajador; private int nomina; public Trabajador(int nomina, String nombreTrabajador, String apPaternoTrabajador, String apMaternoTrabajador) { this.nomina = nomina; this.nombreTrabajador = nombreTrabajador; this.apPaternoTrabajador = apPaternoTrabajador; this.apMaternoTrabajador = apMaternoTrabajador; } ... // los métodos getter y setter son los mismos que los del ejemplo anterior ... @Override public int compareTo(Trabajador comparaTrab) { int comparaNomina=((Trabajador) comparaTrab).getNomina(); // Por orden Ascendente return this.nomina - comparaNomina; // Por orden Descendiente hacerlo así //return comparanomina-this.nomina; } @Override public String toString() { return "[ nomina=" + nomina + ", nombre=" + nombretrabajador + ", apaterno=" + apPaternoTrabajador + ", amaterno=" + apMaternoTrabajador + "]"; } }

Ahora podemos muy bien invocar a Collections.sort en ArrayList

import java.util.*; public class ArrayListSorting { public static void main(String args[]){ ArrayList<Trabajador> arraylist = new ArrayList<Trabajador>(); arraylist.add(new Trabajador(223, "Diana", "Gómez","Azueta")); arraylist.add(new Trabajador(245, "Raul", "Benítez”, "Niss")); arraylist.add(new Trabajador(209, "Karla", "Ochoa", "Rodas")); Collections.sort(arraylist); for(Trabajador str: arraylist){ System.out.println(str); } } }

Salida:

[ nomina=209, name=Karla, apaterno=Ochoa, amaterno=Rodas ] [ nomina=223, name=Diana, apaterno=Gómez, amaterno=Azueta ] [ nomina=245, name=Raul, apaterno=Benítez, amaterno=Niss ]

Page 4: Tutorial   - Ordenar listas Java

Comparable hizo nuestro trabajo, ¿por qué necesitamos a Comparator?

Usando Comparable podemos ordenar por una sola propiedad que debe ser de un tipo entero. Con

el fin de ordenar el ArrayList basado en múltiples propiedades podemos usar Comparator.

Ordenando multiples propiedades de ArrayList<Object> con Comparator

Estamos sobrescribiendo el método compare de Comparator para ordenar. import java.util.Comparator; public class Trabajador { private String nombreTrabajador; private String apPaternoTrabajador; private String apMaternoTrabajador; private int nomina; public Trabajador(int nomina, String nombreTrabajador, String apPaternoTrabajador, String apMaternoTrabajador) { this.nomina = nomina; this.nombreTrabajador = nombreTrabajador; this.apPaternoTrabajador = apPaternoTrabajador; this.apMaternoTrabajador = apMaternoTrabajador; } ... // los métodos getter y setter son los mismos que los del ejemplo anterior ... /*Comparator para ordenar la lista por nombre del trabajador*/ public static Comparator<Trabajador> nombreTrabajadorComparator = new Comparator<Trabajador>() { public int compare(Trabajador s1, Trabajador s2) { String nombreTrabajador1 = s1.getnombreTrabajador().toUpperCase(); String nombreTrabajador2 = s2.getnombreTrabajador().toUpperCase(); // orden ascendente return nombreTrabajador1.compareTo(nombreTrabajador2); // orden descendente //return nombreTrabajador2.compareTo(nombreTrabajador1); }}; /*Comparator para ordenar la lista por número de nómina*/ public static Comparator<Trabajador> nominaComparator = new Comparator<Trabajador>() { public int compare(Trabajador s1, Trabajador s2) { int nomina1 = s1.getNomina(); int nomina2 = s2.getNomina();

Page 5: Tutorial   - Ordenar listas Java

/*Para orden ascendente*/ return nomina1-nomina2; /*Para orden descendente*/ //nomina2-nomina1; }}; @Override public String toString() { return "[ nomina=" + nomina + ", nombre=" + nombretrabajador + ", apaterno=" + apPaternoTrabajador + ", amaterno=" + apMaternoTrabajador + "]"; } }

Clase Detalles: import java.util.*; public class Detalles { public static void main(String args[]){ ArrayList<Trabajador> arraylist = new ArrayList<Trabajador>(); arraylist.add(new Trabajador(101, "Zues", 26)); arraylist.add(new Trabajador(505, "Abey", 24)); arraylist.add(new Trabajador(809, "Vignesh", 32)); /*Ordenamiento basado en el Nombre del Trabajador*/ System.out.println("Ordenamiento por Nombre del Trabajador:"); Collections.sort(arraylist, Trabajador.nombreTrabajadorComparator); for(Trabajador str: arraylist){ System.out.println(str); } /* Ordenamiento basado en la propiedad nómina*/ System.out.println("Ordenamiento por nómina:"); Collections.sort(arraylist, Trabajador.nominaComparator); for(Trabajador str: arraylist){ System.out.println(str); } } }

Salida: Ordenamiento por Nombre del Trabajador: [ nomina=223, name=Diana, apaterno=Gómez, amaterno=Azueta ] [ nomina=209, name=Karla, apaterno=Ochoa, amaterno=Rodas ] [ nomina=245, name=Raul, apaterno=Benítez, amaterno=Niss ] Ordenamiento por nómina: [ nomina=209, name=Karla, apaterno=Ochoa, amaterno=Rodas ] [ nomina=223, name=Diana, apaterno=Gómez, amaterno=Azueta ] [ nomina=245, name=Raul, apaterno=Benítez, amaterno=Niss ]