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; }
代码说明
- 分组存储:
groupedExpenses这个Map确保每个纳税人的支出都单独存储,不会和其他纳税人的混在一起。 - 组内排序:每个
TreeSet都用ComparatorValue(-1)初始化,自动帮我们把该纳税人的支出按金额降序排列。 - 扁平化处理:最后把所有分组的支出集合依次加入结果列表,就能得到“先纳税人1的排序后支出,再纳税人2的”这样的顺序。
另外提醒一下:如果对纳税人的展示顺序有要求(比如按TIN升序),可以把HashMap换成TreeMap,这样遍历Map的时候就会按TIN的自然顺序输出分组啦。
内容的提问来源于stack exchange,提问作者John Mulaney
相关产品推荐
相关产品推荐

