Social

miércoles, 11 de diciembre de 2013

Java: Ordenar un ArrayList

Para colocar los elementos de una lista en orden dentro de un ArrayList se puede utilizar la clase Collections. El siguiente código muestra el resultado de utilizar el método sort() de la clase Collections en un ArrayList:


import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
public class MainTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("-----Ordenado cadenas de texto-----");
List<String> nombres = new ArrayList<String>();
nombres.add("Paco Perez");
nombres.add("José Alvarado");
nombres.add("Pepe Argeta");
nombres.add("Ariel Anonitmo");
nombres.add("Ariel Maldnoado");
nombres.add("Zulma Estrada");
//Si el arraylist es de objetos primitivos como, String, Integer, etc.
//basta con llamar al metodo sort.
Collections.sort(nombres);
for(String nombre : nombres){
System.out.println(nombre);
}
List<Hijo> hijos = new ArrayList<Hijo>();
hijos.add(new Hijo("Paco", "Perez", 20, new Date(11000)));
hijos.add(new Hijo("Pepe", "Argeta", 23, new Date(9000)));
hijos.add(new Hijo("Zulma", "Estrada", 18, new Date(10000)));
System.out.println("-----Ordenado por Fecha-----");
Collections.sort(hijos, new Comparator<Hijo>(){
@Override
public int compare(Hijo o1, Hijo o2) {
return o1.getFechaRegistro().compareTo(o2.getFechaRegistro());
}
});
for(Hijo hijo : hijos){
System.out.println(hijo.getNombre());
}
System.out.println("-----Ordenado por Edad-----");
Collections.sort(hijos, new Comparator<Hijo>(){
@Override
public int compare(Hijo o1, Hijo o2) {
return o1.getEdad().compareTo(o2.getEdad());
}
});
for(Hijo hijo : hijos){
System.out.println(hijo.getNombre());
}
}
}
view raw Ordenar.java hosted with ❤ by GitHub


En la primera parte se puede observar que con objetos del tipo String al utilizar el método sort con un List nos permite ordenar alfabéticamente los elementos sin mucho problema.

Luego se observa la forma de ordenar por medio de atributos de un objeto. Primero se muestra ordenando el objeto Hijo por medio de fechas (que pueden ser de nacimiento, registro, etc.) y luego se ordena la lista por medio de la edad.

Aquí se puede observar la clase Hijo:

import java.util.Date;
public class Hijo {
private String nombre;
private String apellido;
private Integer edad;
private Date fechaRegistro;
private Hijo hijo;
public Hijo(String nombre, String apellido, Integer edad, Date fechaRegistro) {
this.nombre = nombre;
this.apellido = apellido;
this.edad = edad;
this.fechaRegistro = fechaRegistro;
}
public Hijo getHijo() {
return hijo;
}
public void setHijo(Hijo hijo) {
this.hijo = hijo;
}
public Integer getEdad() {
return edad;
}
public void setEdad(Integer edad) {
this.edad = edad;
}
public Hijo(String nombre, String apellido) {
this.nombre = nombre;
this.apellido = apellido;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getApellido() {
return apellido;
}
public void setApellido(String apellido) {
this.apellido = apellido;
}
public Date getFechaRegistro() {
return fechaRegistro;
}
public void setFechaRegistro(Date fechaRegistro) {
this.fechaRegistro = fechaRegistro;
}
}


De esta forma se facilita mucho ordenar objetos por medio de uno de sus atributos.

8 comentarios :

  1. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  2. y si es float, como se realizaria?

    rubencarabias.primerob@gmail.com
    gracias y un saludo!

    ResponderEliminar
    Respuestas
    1. Si utilizas un Float como objeto no debes realizar ningun cambio, pero si necesitas utilizar un float primitivo el comparador deber ir como se muestra a continuación:

      Collections.sort(listaFloats, new Comparator(){

      @Override
      public int compare(float o1, float o2) {
      if(o1 == o2){
      return 0;
      }
      else if(o1 >= o2){
      return 1;
      }
      else{
      return -1;
      }

      }

      });

      Eliminar
  3. ahora bien si se necesita ordenar la lista hijo por nombre como seria??

    ResponderEliminar
    Respuestas
    1. Hola. En este caso dentro del método compare(Hijo o1, Hijo o2) se debería realizar la siguiente comparación o1.getNombre().compareTo(o2.getNombre());

      Eliminar
  4. Hola, y si quiero ordenar por un campo BigDecimal,como sería?

    ResponderEliminar
  5. como filtrarias el arreglo implementadonto un texedit tomando como ejmplo:
    List hijos = new ArrayList();
    hijos.add(new Hijo("Paco", "Perez", 20, new Date(11000)));
    hijos.add(new Hijo("Pepe", "Argeta", 23, new Date(9000)));
    hijos.add(new Hijo("Zulma", "Estrada", 18, new Date(10000)));


    y en el texedit digito apellidos como "perez"

    ResponderEliminar
    Respuestas
    1. En ese caso no quieres ordenar pero obtener la lista filtrada. Puedes recorrer el array y luego obtener los valoresq ue te interesan. Por ejemplo:

      List result = new ArrayList<>();
      for (Hijo hijo : hijos) {
      if (valorDelTextEdit.contains(hijo.getApellido())) {
      result.add(hijo);
      }
      }

      Result tendria los deseado.

      Eliminar