Ordenar ArrayList de objetos personalizados por propiedad
Leí acerca de ordenar ArrayLists usando un Comparador, pero en todos los ejemplos la gente usó compareTo
lo que, según algunas investigaciones, es un método para cadenas.
Quería ordenar una ArrayList de objetos personalizados por una de sus propiedades: un objeto Fecha ( getStartDay()
). Normalmente los comparo así item1.getStartDate().before(item2.getStartDate())
que me preguntaba si podría escribir algo como:
public class CustomComparator {
public boolean compare(Object object1, Object object2) {
return object1.getStartDate().before(object2.getStartDate());
}
}
public class RandomName {
...
Collections.sort(Database.arrayList, new CustomComparator);
...
}
Dado que Date
se implementa Comparable
, tiene un compareTo
método como String
el que tiene.
Entonces tu costumbre Comparator
podría verse así:
public class CustomComparator implements Comparator<MyObject> {
@Override
public int compare(MyObject o1, MyObject o2) {
return o1.getStartDate().compareTo(o2.getStartDate());
}
}
El compare()
método debe devolver un int
, por lo que no podrías devolver directamente un boolean
como estabas planeando hacerlo de todos modos.
Su código de clasificación sería casi como usted escribió:
Collections.sort(Database.arrayList, new CustomComparator());
Una forma un poco más corta de escribir todo esto, si no necesita reutilizar su comparador, es escribirlo como una clase anónima en línea:
Collections.sort(Database.arrayList, new Comparator<MyObject>() {
@Override
public int compare(MyObject o1, MyObject o2) {
return o1.getStartDate().compareTo(o2.getStartDate());
}
});
Desdejava-8
Ahora puede escribir el último ejemplo en una forma más breve utilizando una expresión lambda para Comparator
:
Collections.sort(Database.arrayList,
(o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));
Y List
tiene un sort(Comparator)
método, por lo que puedes acortarlo aún más:
Database.arrayList.sort((o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));
Este es un modismo tan común que hay un método incorporado para generar Comparator
una clase con una Comparable
clave:
Database.arrayList.sort(Comparator.comparing(MyObject::getStartDate));
Todas estas son formas equivalentes.
Las clases que tienen un orden de clasificación natural (una clase Número, por ejemplo) deben implementar la interfaz Comparable, mientras que las clases que no tienen un orden de clasificación natural (una clase Presidente, por ejemplo) deben recibir un Comparador (o un Comparador anónimo). clase).
Dos ejemplos:
public class Number implements Comparable<Number> {
private int value;
public Number(int value) { this.value = value; }
public int compareTo(Number anotherInstance) {
return this.value - anotherInstance.value;
}
}
public class Chair {
private int weight;
private int height;
public Chair(int weight, int height) {
this.weight = weight;
this.height = height;
}
/* Omitting getters and setters */
}
class ChairWeightComparator implements Comparator<Chair> {
public int compare(Chair chair1, Chair chair2) {
return chair1.getWeight() - chair2.getWeight();
}
}
class ChairHeightComparator implements Comparator<Chair> {
public int compare(Chair chair1, Chair chair2) {
return chair1.getHeight() - chair2.getHeight();
}
}
Uso:
List<Number> numbers = new ArrayList<Number>();
...
Collections.sort(numbers);
List<Chair> chairs = new ArrayList<Chair>();
// Sort by weight:
Collections.sort(chairs, new ChairWeightComparator());
// Sort by height:
Collections.sort(chairs, new ChairHeightComparator());
// You can also create anonymous comparators;
// Sort by color:
Collections.sort(chairs, new Comparator<Chair>() {
public int compare(Chair chair1, Chair chair2) {
...
}
});
Para ordenar, ArrayList
puede utilizar el siguiente fragmento de código:
Collections.sort(studList, new Comparator<Student>(){
public int compare(Student s1, Student s2) {
return s1.getFirstName().compareToIgnoreCase(s2.getFirstName());
}
});