Сортировка списка после сортировки ключа - PullRequest
0 голосов
/ 19 мая 2018

Так что мне нужно получить List<Expense> от пользователя, но это упорядочено по убыванию значения затрат.Метод Расхода для получения значения: getValue.На данный момент я получаю только все расходы от каждого пользователя, теперь мне просто нужно его заказать.Что у меня есть это:

public List<Expense> getListFactIndivValor() {
    TreeMap<String, List<Expense>> map = new TreeMap<>();
    Company c = new Company();
    for ( Expense e : c.getExpenses()) { 
        List<Expense> expenses = map.get(e.getTINUser());
        if (expenses == null) {
            expenses = new ArrayList<>();
            map.put(e.getTINUser(), expenses);
        }
        expenses.add(e);
     }

    List<Expense> result = new ArrayList<>();
    for (String s : map.descendingKeySet()) {
        List<Expense> expenses = map.get(s);
        for ( Expense expense : expenses ) {
            result.add( expense);
        }
    }
    return result;
}

Ответы [ 3 ]

0 голосов
/ 19 мая 2018

Вам необходимо отсортировать список расходов с помощью компаратора.

После того, как вы закончите заполнять treeMap (я не уверен, зачем вам нужна здесь карта дерева), вы можете сделать:

return map.entrySet()
           .stream()
           .flatMap(entry -> entry.getValue().stream())
           .collect(Collectors.collectingAndThen(Collectors.toList(), result -> result.stream()
                   .sorted(Comparator.comparingInt(Expense::getValue).reversed())
                    .collect(Collectors.toList())));

Он передает записи карты и выполняет FlatMaps, так какvalue - это список, который собирает его в список (как вы используете последний цикл for).Затем он сортирует список, используя переданный Comparator, который сортирует список в обратном порядке (reversed()) и снова собирает результат в список.

0 голосов
/ 19 мая 2018

Вы можете отсортировать Expense по двум свойствам одновременно, заполнять TreeMap не нужно.Это своего рода трата.

Попробуйте это:

public List<Expense> getListFactIndivValor() {
    List<Expense> expense = c.getExpenses();
    Collections.sort(expense, Comparator.comparing(Expense::getTinUser)
                                     .thenComparing(Expense::getValue));
    return expense;
}
0 голосов
/ 19 мая 2018

Расходы должны реализовать Comparable .Затем вам нужно отсортировать список в нижней части вашего метода перед оператором возврата, например:

sizes.sort (Comparator.comparing (Expense :: getValue));

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...