Сортировка 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)
→ Ссылка