树形数据逐级向上汇总-java

这篇具有很好参考价值的文章主要介绍了树形数据逐级向上汇总-java。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


对树状指定结构的某一项,进行求和。上一级该项值,是下级所有该项之和(依次递归)。

举例最终结果形如:

[
    {
        "id": 1,
		"pid":null
        "amount": "12011001",
        "sonList": [
            {
                "id": 2,
				"pid":1,
                "amount": "12011001",
                "sonList": [
                    {
					    "id": 3,
						"pid":2,
                        "amount": "1001",
                        "sonList": [],
						"leaf": true
                    },
                    {
					    "id": 4,
						"pid":2,
                        "amount": "12010000",
                        "sonList": [],
                        "leaf": true
                    }
                ],
                "leaf": false
            }
        ],
        "leaf": false
    }
]

思路:

第一步,为源对象加入 leaf 字段,默认全部为false

第二步,拿出List集合,将最底层标记为叶子节点,leaf=true (没有子节点的对象为叶子节点),并将该集合复制一份作为操作数据集合 nt

第三步,对复制出来的集合进行过滤,如果为叶子 leaf=true,取pid为key,对象塞入list为value,生成Map

第四步,根据Map的key分别求和,并从原数据过滤 id = pid 的数据,将和塞入该父节点的值,并将父节点 leaf设置为true

第五步,将复制出来的操作数据集合 nt 中,所有参与计算的叶子节点移除

第六步,判断是否存在叶子节点,不存在结束,存在递归调用第三步

第七步,根据list集合对应成Tree状结构

第三步到第六步 代码:

(注:前面有所简化,部分字段和代码不一致 id对应itemCode,pid对应preCode)文章来源地址https://www.toymoban.com/news/detail-460834.html

/**
 * 逐层计算
 * @param allItems 全部数据
 * @param nt       copy出来的数据
 */
private void countForSon(List<FundmanageBudgetItemTreeRo> allItems, List<FundmanageBudgetItemTreeRo> nt) {
    if (null == nt) {
        nt = new ArrayList<>(allItems);
    }
    Map<String, List<FundmanageBudgetItemTreeRo>> temp = nt.stream().filter(FundmanageBudgetItemTreeRo::isLeaf).collect(Collectors.groupingBy(FundmanageBudgetItemTreeRo::getPreCode));
    for (String preCode : temp.keySet()) {
        List<FundmanageBudgetItemTreeRo> fundmanageBudgetItemTreeRos = temp.get(preCode);
        BigDecimal amount = new BigDecimal("0");
        for (FundmanageBudgetItemTreeRo fundmanageBudgetItemTreeRo : fundmanageBudgetItemTreeRos) {
            amount = amount.add(new BigDecimal(fundmanageBudgetItemTreeRo.getAmount()));
            nt.remove(fundmanageBudgetItemTreeRo);
        }
        Optional<FundmanageBudgetItemTreeRo> first = allItems.stream().filter(it -> it.getItemCode().equals(preCode)).findFirst();
        if (first.isPresent()) {
            first.get().setAmount(amount.toString());
        }
        nt.stream().filter(it -> it.getItemCode().equals(preCode)).peek(it -> it.setLeaf(true)).collect(Collectors.toList());
    }
    if (nt.size() != 0 && temp.keySet().size() != 0) {
        this.countForSon(allItems, nt);
    }
}

第七步生成树代码

private FundmanageBudgetItemTreeRo buildTree(FundmanageBudgetItemTreeRo root, List<FundmanageBudgetItemTreeRo> allItems) {
    if (null == root.getSonList()) {
        root.setSonList(new ArrayList<>());
    }
    List<FundmanageBudgetItemTreeRo> collect = allItems.stream().filter(it -> it.getPreCode().equals(root.getItemCode())).peek(it -> {
        FundmanageBudgetItemTreeRo son = new FundmanageBudgetItemTreeRo();
        BeanUtils.copyProperties(it, son);
        root.getSonList().add(son);
    }).collect(Collectors.toList());
    for (FundmanageBudgetItemTreeRo treeRo : collect) {
        this.buildTree(treeRo, allItems);
    }
    return root;
}

到了这里,关于树形数据逐级向上汇总-java的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java返回前端树形结构数据(2种实现方式)

    0.思想 首先找到一级目录(类别),然后从一级目录(类别)递归获取所有子目录(类别),并组合成为一个“目录树” 1.普通实现:controller层传的是0层,就是一级目录层,从这里开始往下递归。 2.stream流实现: 3.实体类集合专VO类集合的工具类 入参为未知类型的实体集合

    2024年02月04日
    浏览(35)
  • java根据前端所要格式返回树形3级层级数据

    一、业务分析,根据前端需求返回如下数据格式   二、后端设计数据类型VO 三、代码实现 1.编写Controller 2.编写Service 3、结果展示            

    2024年02月19日
    浏览(43)
  • 【SQL开发实战技巧】系列(二十一):数据仓库中时间类型操作(进阶)识别重叠的日期范围,按指定10分钟时间间隔汇总数据

    【SQL开发实战技巧】系列(一):关于SQL不得不说的那些事 【SQL开发实战技巧】系列(二):简单单表查询 【SQL开发实战技巧】系列(三):SQL排序的那些事 【SQL开发实战技巧】系列(四):从执行计划讨论UNION ALL与空字符串UNION与OR的使用注意事项 【SQL开发实战技巧】系列

    2023年04月09日
    浏览(91)
  • 关于Java中对象的向上转型和向下转型

    同一个类调用同一个方法会产生不同的影响/结果 这就是多态 限制对子类特有方法的访问 使用子类特有的方法

    2023年04月20日
    浏览(32)
  • Java:什么是向上转型与向下转型(详细图解)

    目录 一、什么是向上转型 1、概念 2、代码示例 3、向上转型的优缺点 二、什么是向下转型 1、向下转型的概念 ​编辑 2、代码示例 三、向下转型的缺点及 instanceof 的使用 1、向下转型的缺点 2、instanceof的使用 向上转型就是 创建一个子类对象 ,将其 当成父类对象来使用 。

    2024年03月23日
    浏览(44)
  • 华为OD机试 - 树状结构查询(Java & JS & Python)

    题目描述 通常使用多行的节点、父节点表示一棵树,比如 西安 陕西 陕西 中国 江西 中国 中国 亚洲 泰国 亚洲 输入一个节点之后,请打印出来树中他的所有下层节点 输入描述 第一行输入行数,下面是多行数据,每行以空格区分节点和父节点 接着是查询节点 输出描述 输出

    2024年02月11日
    浏览(49)
  • 【高级数据结构】树状数组

    目录 树状数组1 (单点修改,区间查询) 树状数组2(区间修改,单点查询) 树状数组1 (单点修改,区间查询) 题目链接:洛谷 树状数组1 题目描述 如题,已知一个数列,你需要进行下面两种操作: 将某一个数加上 x 求出某区间每一个数的和 输入格式 第一行包含两个正

    2024年02月15日
    浏览(48)
  • 数据结构<1>——树状数组

    前言:树状数组能解决的问题线段树一定可以解决。然后关于线段树的内容会在2中讲解。 树状数组,也叫Fenwick Tree和BIT(Binary Indexed Tree),是一种支持 单点修改 和 区间查询 的,代码量小的数据结构。 那神马是单点修改和区间查询?我们来看一道题。 洛谷P3374(模板): 在本题中

    2024年01月25日
    浏览(61)
  • Java利用LocalTime的withMinute按半小时向上/下取整

    向下取整 08:00——》08:00 08:01——》08:00 08:29——》08:00 08:30——》08:30 08:31——》08:30 08:59——》08:30 然后我们可以利用向下取整后的值再+30分钟拿到时间段。 08:00——》08:30 08:01——》08:30 08:29——》08:30 08:30——》09:00 08:31——》09:00 08:59——》09:00 DateTimeFormatter是线程安全的

    2024年02月15日
    浏览(33)
  • 关于java中的多态和对实例化对象以及向上、向下转型的一些理解

    java面向对象三大特征即为:继承封装多态。而多态需要三大必要条件。分别是:继承、方法重写、父类引用指向子类对象。我们先一个一个来理解。 1、首先是继承和重写。这个很简单。因为多态就是建立在不同的重写之上的。也就是说多态就是在使用着一个方法的不同重写

    2024年02月02日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包