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

Java实现按纳税人分组且组内支出降序排序的问题

解决按纳税人分组+组内支出金额降序排序的问题

首先得帮你捋清楚当前代码的核心问题:TreeSet是一个全局有序的集合,它只会把所有符合条件的Expense按金额排序,但没法做到先按纳税人分组,再在每组内部排序——因为所有纳税人的支出都会混在同一个TreeSet里,完全没有分组的结构。

要实现你的需求,我们需要用一个键为纳税人标识(比如TIN),值为该纳税人支出集合的Map,每个集合内部再按金额降序排序。具体步骤如下:

具体实现方案

  • 用Map<String, TreeSet<Expense>>存储分组数据:key是纳税人的TIN,value是该纳税人的支出集合,每个TreeSet用你已经写好的ComparatorValue(-1)实现金额降序排序。
  • 遍历纳税人用户时,为每个纳税人单独维护对应的支出集合,而不是把所有支出都塞进同一个全局TreeSet。
  • 最后如果需要返回扁平化列表(先展示纳税人1的所有排序后支出,再展示纳税人2的),可以把Map里的所有TreeSet元素按顺序拼接;如果需要保留分组结构,直接返回这个Map即可。

修改后的代码示例

public List<Expense> getListFactIndivValor() {
    // 用Map存储分组:key是纳税人TIN,value是该纳税人按金额降序排序的支出集合
    Map<String, TreeSet<Expense>> groupedExpenses = new HashMap<>();
    Company c = (Company) this.users.get(userId); // 获取当前登录公司

    for (User u : this.users.values()) {
        if (!u.getUserType()) { // 判断是否为纳税人用户
            String taxpayerTIN = u.getTIN();
            // 为当前纳税人初始化对应的TreeSet(如果还没创建的话)
            groupedExpenses.putIfAbsent(taxpayerTIN, new TreeSet<>(new ComparatorValue(-1)));
            TreeSet<Expense> taxpayerExpenses = groupedExpenses.get(taxpayerTIN);

            // 筛选当前纳税人的支出并加入集合
            for (Expense e : c.getExpenses().values()) {
                if (taxpayerTIN.equals(e.getTINUser())) {
                    taxpayerExpenses.add(e.clone());
                }
            }
        }
    }

    // 如果需要返回扁平化的列表(按纳税人顺序,每组内降序)
    List<Expense> result = new ArrayList<>();
    for (TreeSet<Expense> expenses : groupedExpenses.values()) {
        result.addAll(expenses);
    }
    return result;

    // 如果需要保留分组结构,直接返回Map即可:
    // return groupedExpenses;
}

代码说明

  1. 分组存储:groupedExpenses这个Map确保每个纳税人的支出都单独存储,不会和其他纳税人的混在一起。
  2. 组内排序:每个TreeSet都用ComparatorValue(-1)初始化,自动帮我们把该纳税人的支出按金额降序排列。
  3. 扁平化处理:最后把所有分组的支出集合依次加入结果列表,就能得到“先纳税人1的排序后支出,再纳税人2的”这样的顺序。

另外提醒一下:如果对纳税人的展示顺序有要求(比如按TIN升序),可以把HashMap换成TreeMap,这样遍历Map的时候就会按TIN的自然顺序输出分组啦。

内容的提问来源于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:32:47