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.以上就是所有的模型計算和的代碼,希望可以幫助你!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章