Сортировка Araylist при обьединении по условию
List<Report> total = new ArrayList<>(reportTrue);
total.addAll(reportFalse);
total.sort(Comparator.comparing(Report::getMonth)
.thenComparing(Report::isTrue, Comparator.reverseOrder()) // true before false
);
Сортирует два списка по месяцу, по условию полей isExpense их объектов, true перед false.
Как изменить, чтобы была эта же сортировка, но чтобы объект с полем true был первым, если у этого обьекта сумма getSum() больше, чем у объекта с false, и наоборот.
Ответы (1 шт):
Автор решения: Alex Rudenko
→ Ссылка
По идее достаточно просто добавить условие о сортировке по полю getSum в обратном порядке:
total.sort(Comparator
.comparing(Report::getMonth)
.thenComparing(Report::getSum, Comparator.reverseOrder())
.thenComparing(Report::isFlag, Comparator.reverseOrder()) // true before false
);
total.forEach(System.out::println);
Для тестовых данных:
List<Report> listTrue = Arrays.asList(
new Report(1, true, 10), new Report(1, true, 25),
new Report(2, true, 20), new Report(3, true, 10),
new Report(5, true, 20)
);
List<Report> listFalse = Arrays.asList(
new Report(1, false, 30), new Report(2, false, 5),
new Report(2, false, 15), new Report(5, false, 25)
);
Результат:
Report(month=1, flag=false, sum=30)
Report(month=1, flag=true, sum=25)
Report(month=1, flag=true, sum=10)
Report(month=2, flag=true, sum=20)
Report(month=2, flag=false, sum=15)
Report(month=2, flag=false, sum=5)
Report(month=3, flag=true, sum=10)
Report(month=5, flag=false, sum=25)
Report(month=5, flag=true, sum=20)