04 septiembre 2007

Ordenar un List de Objectos mediante Comparator

Si tenemos un List de objectos de la clase tipo ClaseA:

public class ClaseA{
private String titulo;
private Date fechaDate;


public long getFechaLong() {
return fechaDate.getTime();
}
public void setFechaLong(long fechaLong) {
this.fechaLong = fechaLong;
}
}

y lo que queremos es ordenar ese List por un campo de la clase deberemos crear un método estático final java.util.Comparator como el que pongo debajo, la ordenación se hace por el campo fechaDate del tipo java.util.Date


public static final Comparator COMPARA_FECHAS_ClaseA = new Comparator() {

public int compare(Object o1, Object o2) {
if (o1 == o2 || !(o1 instanceof ClaseA ) || !(o2 instanceof ClaseA )) {
return 0;
} else {
ClaseA r1 = (ClaseA) o1;
ClaseA r2 = (ClaseA ) o2;
long date1 = r1.getFechaLong();
long date2 = r2.getFechaLong();
return date1 <= date2 ? ((int) (date1 >= date2 ? 0: 1)): -1;
}
}
};

este método lo metemos en nuestra clase ClaseA quedando como aparece debajo:


public class ClaseA{
private String titulo;
private Date fechaDate;


public long getFechaLong() {
return fechaDate.getTime();
}
public void setFechaLong(long fechaLong) {
this.fechaLong = fechaLong;
}

public static final Comparator COMPARA_FECHAS_ClaseA = new Comparator() {

public int compare(Object o1, Object o2) {
//comprueba si los objectos que le llegan son del tipo de la clase
if (o1 == o2 || !(o1 instanceof ClaseA ) || !(o2 instanceof ClaseA )) {
return 0;
} else {
ClaseA r1 = (ClaseA) o1;
ClaseA r2 = (ClaseA ) o2;
long date1 = r1.getFechaLong();
long date2 = r2.getFechaLong();
// realiza las operaciones de comparación entre las fechas de las clases o1 y o2
return date1 <= date2 ? ((int) (date1 >= date2 ? 0: 1)): -1;
}
}
};
}

Para poder utilizar la ordenación solo hay que llamar al método de la siguiente forma:

List listClasesA= new ArrayList();
// aquí introducirías todos los objectos ClaseA

//Esta es la parte que ordena ese List
Collections.sort(listClasesA, ClaseA.COMPARA_FECHAS_ClaseA);


espero que os sirva ;-)