Sunday, November 22, 2015

Sort ArrayList of custom Objects by property - Ordenar ArrayList por cualquiera de los elementos que lo componen

Aveces debemos de ordenar ArrayList por cualquiera de los elementos internos como por ejemplo, tenemos el siguiente ArrayList de tipo Persona

ArrayList<Persona> people = new ArrayList<>();

            people.add(new Persona("Joe", 92422, df.parse("12-12-2010")));
            people.add(new Persona("Joef", 24122, df.parse("1-12-2010")));
            people.add(new Persona("Joee", 24922, df.parse("12-2-2010")));

y queremos ordenar el Array por orden del Id de mayor a menor, o de menor a mayor, o por fecha de mayor a menor o de menoy a mayor, la solucion es la siguiente:

import java.util.Date;

public class Persona {

   
    public String name;
    public int id;
    public Date hireDate;

    public Persona(String iname, int iid, Date ihireDate) {
        name = iname;
        id = iid;
        hireDate = ihireDate;
    }
   
    public String toString() {
        return name + " " + id + " " + hireDate.toString();
    }
}

//-----------------------------------------------------------------------------------//

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class Principal {

    public static void main(String[] args) {
       
       
        SimpleDateFormat df = new SimpleDateFormat("mm-dd-yyyy");
        ArrayList<Persona> people = new ArrayList<>();

        try {
            people.add(new Persona("Joe", 92422, df.parse("12-12-2010")));
            people.add(new Persona("Joef", 24122, df.parse("1-12-2010")));
            people.add(new Persona("Joee", 24922, df.parse("12-2-2010")));
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
       
        Collections.sort(people, new CompId());
        System.out.println("BY ID");
        for (Persona p : people) {
            System.out.println(p.toString());
        }
       
        System.out.println("//-----------------------------------------//");
       
       
        Collections.sort(people, new CompDate(false));
        System.out.println("BY Date asc");
        for (Persona p : people) {
            System.out.println(p.toString());
        }
       
        Collections.sort(people, new CompDate(true));
        System.out.println("BY Date desc");
        for (Persona p : people) {
            System.out.println(p.toString());
        }

       
    }
   
      public static class CompId implements Comparator<Persona> {
            @Override
            public int compare(Persona arg0, Persona arg1) {
                return arg0.id - arg1.id;
            }
        }
     
      public static class CompDate implements Comparator<Persona> {
            private int mod = 1;
            public CompDate(boolean desc) {
                if (desc) mod =-1;
            }
            @Override
            public int compare(Persona arg0, Persona arg1) {
                return mod*arg0.hireDate.compareTo(arg1.hireDate);
            }
        }

}
De esta manera tenemos nuestro ArrayList organizado por ID y fecha

No comments:

Post a Comment