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

之前有个需求就是树结构展示需要计算每个节点的和,我就一直想怎么实现,到最后有思路但是有些问题还是卡在那里了,后来网上搜索给了灵感实现出来了,但是那个网址没有保存关闭以后就找不到了,那么我就就我的实现方式记录在博客里把,最后实现的功能如下图:

1.父节点计算子节点的和,子节点在计算子子节点的和。。。

2.看了上面的图起码知道一定得先计算没有子节点的节点也就是最后一个节点,才能依次计算父节点,这样才能计算正确的数字和,那么怎么实现呢?上代码

先传输父节点的数据

public List<TreeDTO> queryTree() {
    // 查询库的数据
    List<Map<String, Object>> list = modelBaseMapper.selectMaps(null);
    // *********************求节点的和-开始
        if (list.size() > 0) {
            List<Map<String, Object>> templist = new ArrayList<>();
            for (int i = 0; i < list.size(); i++) {
                if (list.get(i).containsKey("PARENTID")) {
                    // 获取所有的父节点
                    if (list.get(i).get("PARENTID").toString().equals("0")) {
                        // 求得各个节点的和
                        doCount(list.get(i), list);
                    }
                }
            }
        }
        // *********************求节点的和-结束
        // 封装树结构
}

3.list的结构就还是数据库查询的数据,此时还没生成树结构,大致结构如下:

[{"PARENTID":"0","MODELID":"24CBEFABDE274BE1B78119048FEC2A34","MODELNAME","xx管理","TOTALCOUNT":"0"},{"PARENTID":"1C20742A5B6945F7A9B3550E585D200E","MODELID":"41757D73A0424E3B8E4598A13EC9B2C1","MODELNAME","xxxxxx评价模型","TOTALCOUNT":"4"},{"PARENTID":"1C20742A5B6945F7A9B3550E585D200E","MODELID":"5CB4C8BA579E4A0A8D5D2EAC2850168F","MODELNAME","xxxxxx评价模型","TOTALCOUNT":"5"},。。。。。]

4.进行求和代码,主要是进行递归处理方式

/**
     * 实现给各节点计算总和
     *
     * @param root    根
     * @param allList 所有的数据
     * @return
     */
    public static Integer doCount(Map<String, Object> root,
                                  List<Map<String, Object>> allList) {
        Integer sum = 0;
        // 获得当前节点的子节点数据
        List<Map<String, Object>> templist = findByQueryString(root.get("MODELID").toString(), allList);
        // 当前节点没有子节点的时候返回需要的数字。
        if (templist == null || templist.size() == 0) {
            if (null != root.get("TOTALCOUNT")) {
                return Integer.parseInt(root.get("TOTALCOUNT").toString());
            } else {
                return sum;
            }
        }
        // 当前节点有子节点的时候,进行循环查找子节点
        if (templist != null && templist.size() > 0) {
            for (Map child : templist) {
                //递归
                Integer numCount = doCount(child, allList);
                //求和计算
                sum += numCount;
            }
        }
        // 给当前节点赋值为计算完毕的值
        root.put("TOTALCOUNT", sum.intValue());
        return sum;
    }

5.查找当前传递的节点的子节点数据,并返回代码

/**
     * 递归查找子节点
     *
     * @param pid  id
     * @param allList 所有的数据
     * @return
     */
    public static List<Map<String, Object>> findByQueryString(String pid,
                                                              List<Map<String, Object>> allList) {
        List<Map<String, Object>> childist = new ArrayList<>();
        // 查找子节点操作
        for (Map<String, Object> map : allList) {
            if (map.get("PARENTID").toString().equals(pid)) {
                childist.add(map);
            }
        }
        return childist;
    }

6.以上就是所有的模型计算和的代码,希望可以帮助你!

猜你喜欢

转载自blog.csdn.net/dfBeautifulLive/article/details/104608786