Java 实现树结构计算各个节点数的和

该代码片段展示了如何将列表数据转换成树形结构,使用了TreeNode类和TreeUtil工具类。在转换过程中,设置了自定义属性并计算每个节点的值,特别地,仓库函数用于递归计算子节点的总数并附加到节点的额外信息中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

private List<ESHomeSearchTreeVo> tree(List<ESHomeSearchTreeVo> allList){

        // 构建的整个树数据
        List<TreeNode<String>> treeNodeList = allList.stream().map(x -> {
            Map<String, Object> extraMap = new HashMap<>();
            extraMap.put("num", x.getNum());
            // 单个树数据构建
            TreeNode<String> treeNode = new TreeNode<String>()
                    .setId(String.valueOf(x.getId())) // 主键
                    .setParentId(String.valueOf(x.getParentId())) // 父节点ID
                    .setName(x.getName()) // 名称
                    .setExtra(extraMap);
            return treeNode;
        }).collect(Collectors.toList());

        // 配置
        TreeNodeConfig treeNodeConfig = new TreeNodeConfig();
        // 自定义属性名(修改默认名称)
        treeNodeConfig.setChildrenKey("children");
        // 最大递归深度
        treeNodeConfig.setDeep(10);

        //转换器
        List<Tree<String>> treeNodes = TreeUtil.build(treeNodeList, "0", treeNodeConfig,
                (treeNode, tree) -> {
                    // 给树节点赋值(还能set 父 或子节点树)
                    tree.setId(treeNode.getId());
                    tree.setParentId(treeNode.getParentId());
                    tree.setName(treeNode.getName());
                    tree.putExtra("num", treeNode.getExtra().getOrDefault("num", null));
                });

        treeNodes.forEach(this::warehouse);
        List<ESHomeSearchTreeVo> esHomeSearchTreeVos = JSONUtil.toList(JSONUtil.toJsonStr(treeNodes), ESHomeSearchTreeVo.class);

        return esHomeSearchTreeVos;
    }

计算每个节点的值

private void warehouse(Tree<String> e) {
        // 如果没有子节点返回自己
        if (e.getChildren() == null) {
            e.putExtra("num", e.get("num"));
            return;
        }
        // 有子节点的话进行相应处理
        e.getChildren().forEach(this::warehouse);
        int num = e.getChildren().stream().mapToInt(m -> MapUtil.getInt(m, "num")).sum();
        e.putExtra("num", num);
    }

结果展示:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值