如何对按用户分组后的Expense列表按Value降序排序?
解决方案:给每个用户的Expense列表按Value降序排列
嘿,这事儿好办!你已经搞定了按用户分组和用户key降序的部分,现在只需要给每个用户的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<>(); // 遍历降序的用户key for (String s : map.descendingKeySet()) { List<Expense> expenses = map.get(s); // 关键修改:给当前用户的Expense列表按Value降序排序 expenses.sort((e1, e2) -> Double.compare(e2.getValue(), e1.getValue())); // 如果getValue()返回的是Integer,替换成Integer.compare(e2.getValue(), e1.getValue()) // 将排序后的列表加入结果集 for (Expense expense : expenses) { result.add(expense); } } return result; }
关键修改说明:
- 在遍历每个用户的Expense列表时,新增了
expenses.sort(...)这一行,用Lambda表达式实现自定义比较器:e2.getValue()在前、e1.getValue()在后,这样就能实现降序排列(大的Value排在前面)- 注意匹配
getValue()的返回类型:如果返回的是Integer就用Integer.compare,返回Double就用Double.compare,避免类型转换问题
另外,如果你用的是Java 8及以上版本,也可以用Stream API来简化整个流程,代码会更紧凑:
public List<Expense> getListFactIndivValor() { Company c = new Company(); return c.getExpenses() // 按用户分组,用TreeMap保证用户key可排序 .stream() .collect(Collectors.groupingBy(Expense::getTINUser, TreeMap::new, Collectors.toList())) // 按用户key降序遍历 .descendingMap() .values() .stream() // 每个用户的列表按Value降序排序 .map(list -> { list.sort((e1, e2) -> Double.compare(e2.getValue(), e1.getValue())); return list; }) // 合并所有列表为一个结果集 .flatMap(List::stream) .collect(Collectors.toList()); }
这个Stream版本的逻辑和循环版本完全一致,但代码更简洁,你可以根据自己的习惯选择。
内容的提问来源于stack exchange,提问作者John Mulaney
相关产品推荐
相关产品推荐

