Упаковка массива объектов в коллекцию в отсортированном порядке по двум параметрам
Есть класс 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 шт):
Не рекомендую вам использовать 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