Сортировка базы ArrayList по нескольким атрибутам

У меня есть объект ArrayList. Объект содержит атрибуты date и value. Поэтому я хочу сортировать объекты на date, а для всех объектов в ту же дату я хочу отсортировать их на value. Как я могу это сделать?

Ответ 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 на основе результатов.