У меня есть объект ArrayList. Объект содержит атрибуты date
и value
. Поэтому я хочу сортировать объекты на date
, а для всех объектов в ту же дату я хочу отсортировать их на value
. Как я могу это сделать?
Сортировка базы ArrayList по нескольким атрибутам
Ответ 1
Внедрите пользовательский Comparator
, затем используйте Collections.sort(List, Comparator)
. Вероятно, это выглядит примерно так:
public class FooComparator implements Comparator<Foo> {
public int compare(Foo a, Foo b) {
int dateComparison = a.date.compareTo(b.date);
return dateComparison == 0 ? a.value.compareTo(b.value) : dateComparison;
}
}
Collections.sort(foos, new FooComparator());
Ответ 2
public static <T> void sort(List<T> list, final List<Comparator<T>> comparatorList) {
if (comparatorList.isEmpty()) {//Always equals, if no Comparator.
throw new IllegalArgumentException("comparatorList is empty.");
}
Comparator<T> comparator = new Comparator<T>() {
public int compare(T o1, T o2) {
for (Comparator<T> c:comparatorList) {
if (c.compare(o1, o2) > 0) {
return 1;
} else if (c.compare(o1, o2) < 0) {
return -1;
}
}
return 0;
}
};
Collections.sort(list, comparator);
}
Ответ 3
Если вы хотите, чтобы пример кода выглядел, вы можете использовать следующее:
Collections.sort(foos, new Comparator<Foo>{
public int compare(Foo a, Foo b) {
int dateComparison = a.date.compareTo(b.date);
return dateComparison == 0 ? a.value.compareTo(b.value) : dateComparison;
}
});
Ответ 4
Если класс объекта реализует Comparable, то все, что вам нужно сделать, это правильно закодировать метод compareTo, чтобы сначала сравнить даты, а затем, если даты равны, сравнить значения, а затем вернуть соответствующий результат int на основе результатов.