1. 程式人生 > 其它 >Java 實現樹結構計算各個節點數的和

Java 實現樹結構計算各個節點數的和

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);
    }

結果: