Упаковка массива объектов в коллекцию в отсортированном порядке по двум параметрам

Есть класс Operation

public class Operation {
    private LocalDate date;
    private String type;
}

Я получаю массив объектов Operation из апи. Поле type может принимать несколько значений, но самыми важными являются: income и tax. Необходимо чтобы сначала в list'e или в Set'e шли объекты с type="income" в хронологическом порядке по полю date на убывание даты(), а потом tax в хронологическом порядке по полю date на убывание даты(), и только потом все остальное в независимости от поля type в хронологическом порядке по полю date на убывание даты(). Например:

1) "income", 2020.10.22
2) "income", 2020.09.21 
3) "tax", 2020.11.21 
4) "tax", 2020.08.21 
5) "asdsadas", 2020.11.21 

Изначально думал о treeset с компаратором, а потом уже подумал реализовать Comparator или Comparable. В общем то как будет реализована задача, не особо важно. Но хотелось бы через TreeSet чтобы на этапе парсинга ответа от апи все ложить в коллекцию в заданной последовательности. Заранее спасибо;)


Ответы (1 шт):

Автор решения: JVic

Не рекомендую вам использовать TreeSet пока вы ясно не поймете что вам нужен именно TreeSet, после добавления следующих двух записей в TreeSet

1) "income", 2020.09.21
2) "income", 2020.09.21

у вас останется только одна

Пример компараторов из соседнего ответа будет работать но не для TreeSet'a

Простой пример для вашего случая: ВНИМАНИЕ нет никаких проверок на null, это вы уже сами как нибудь. Данный пример будет работать только с объектами у которых заполненны и дата и тип. Также данный пример только для демонстрации компаратора, здесь нет логики по приоритезации типов (income, tax, asasas), как компаратор отсортирует строку так и будет. Но имея на руках этот пример не сложно написать еще пару условий что бы эта приоритезация по типу добавилась. Для этого вам все так придется почитать про компараторы, благо в сети полно информации

public class Operation implements Comparable<Operation> {
    private LocalDate date;
    private String type;

    @Override
    public int compareTo(final Operation o) {
        if (this == o) {
            return 0;
        }

        if (o == null) {
            return 1;
        }

        int i = this.type.compareTo(o.type);
        if (i != 0) {
            return i;
        }

        return this.date.compareTo(o.date);
    }
}

И опять же таки если вы останетесь с TreeSet'om у вас будут "сжираться" идентичные записи

Что бы отсортировать коллекцию таких объектов можно использовать:

Collections.sort(list);

Или же использовать SortedArrayList

→ Ссылка