排序密钥后对列表进行排序

时间:2018-05-19 13:25:19

标签: java list sorting

所以我需要一个用户获得一个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 :(得分:3)

您可以一次按Expense两个属性排序,无需填充TreeMap。这有点浪费。

试试这个:

public List<Expense> getListFactIndivValor() {
    List<Expense> expense = c.getExpenses();
    Collections.sort(expense, Comparator.comparing(Expense::getTinUser)
                                     .thenComparing(Expense::getValue));
    return expense;
}

答案 1 :(得分:0)

费用需要implement Comparable。然后,在返回语句之前,您需要在方法底部sort the list,例如:

  

expenses.sort(Comparator.comparing(费用::的getValue));

希望有所帮助!

答案 2 :(得分:0)

您需要使用比较器对费用列表进行排序。

完成填充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它,因为该值是一个列表并将其收集到一个列表中(就像使用上一个for循环一样)。然后它使用传递的Comparator对列表进行排序,该列表以相反的顺序(reversed())对列表进行排序,然后再将结果收集到列表中。

相关问题