You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对按用户分组后的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:58:48