所以我需要一个用户获得一个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;
}
答案 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()
)对列表进行排序,然后再将结果收集到列表中。