1. 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 tuArrayListesde untipode objetopersonalizado,enesecasotienesdosopcionespara
ordenar,el usode lasinterfacescomparableycomparator.Antesde verel ejemplo,veamoscuál es
la salida cuando intentamos ordenar un arraylist de Objects sin implementar alguna de estas
intefaces.
¿Por qué necesitamos de Comparable y Comparator?
Considerael siguiente ejemplo–tengolaclase Trabajadorque tiene propiedadescomonombre 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;
2. }
public void setNomina(int nomina) {
this.nomina = nomina;
}
}
Y quierotenerun ArrayListof StudentObject. We doitlike 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é llamara Collections.sort() enla Listade Objectsy obtuve unmensaje de errorcomo
este –
Exceptioninthread“main”java.lang.Error:Unresolvedcompilationproblem:
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 ArrayListde Objectsque realmente nofuncionaa menosque
uses interfaces como Comparable y Comparator.
Ahoradebeshabercomprendidolaimportanciade estasinterfaces.Veamoscómousarlas.
Ordenamiento de ArrayList<Object> con Comparable
Digamos que necesitamos ordenar el ArrayList<Trabajador> basado en la propiedad Apellidodel
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;
3. 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 + "]";
}
}
Ahorapodemosmuybieninvocara Collections.sort enArrayList
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 ]
4. Comparable hizo nuestro trabajo, ¿por qué necesitamos a Comparator?
Usando Comparable podemosordenarporunasolapropiedadque debeser de untipoentero.Con
el fin de ordenar el ArrayList basado en múltiples propiedades podemos usar Comparator.
Ordenandomultiplespropiedadesde ArrayList<Object> con Comparator
Estamossobrescribiendoel 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();
5. /*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 ]