1. 程式人生 > 其它 >使用HutoUtil 中TreeUtil進行樹形結構操作(可直接執行)

使用HutoUtil 中TreeUtil進行樹形結構操作(可直接執行)

使用HutoUtil 中TreeUtil進行樹形結構操作(可直接執行)

pom.xml

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.4.6</version>
</dependency>

實體類

@Data
@Accessors(chain = true)
public class TreeDemo {
    private Integer id;
    private Integer parentId;
    private Integer level;
    private String  levelName;
    private Integer isEfficient;
    private Integer isShow;
    private String createdBy;
    private Date createdDate;
    private String updatedBy;
    private Date updatedDate;
}

測試類

import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.lang.tree.TreeNodeConfig;
import cn.hutool.core.lang.tree.TreeUtil;
import cn.hutool.json.JSONUtil;

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * TODO 樹形結構測試
 * @date 2021/12/22 11:41
 */
public class TestDemo {
    public static void main(String[] args) {
        List<TreeDemo> treeDemoList = new ArrayList<>();
        treeDemoList=initTreeDemo();

        // 1、將源資料轉化為樹
        List<Tree<Integer>> build = transform(treeDemoList);

        //2、通過子節點查詢父節點
        List<TreeDemo> parentList = childToParent(treeDemoList,build);

        //3、通過父節點查詢子節點
        Tree<Integer> tree= parentToChile(build);

    }


    /**
     *  1:初始化資料
     */
    public static List<TreeDemo> initTreeDemo(){
        List<TreeDemo> treeDemoList = new ArrayList<>();
        TreeDemo treeDemo  = new TreeDemo();
        treeDemo.setId(1).setParentId(0).setLevel(1).setLevelName("A").setIsEfficient(1).setIsShow(1);
        TreeDemo treeDemo1  = new TreeDemo();
        treeDemo1.setId(2).setParentId(1).setLevel(2).setLevelName("B").setIsEfficient(1).setIsShow(1);
        TreeDemo treeDemo2  = new TreeDemo();
        treeDemo2.setId(3).setParentId(2).setLevel(3).setLevelName("C").setIsEfficient(1).setIsShow(1);
        TreeDemo treeDemo3  = new TreeDemo();
        treeDemo3.setId(4).setParentId(3).setLevel(4).setLevelName("D").setIsEfficient(1).setIsShow(1);
        TreeDemo treeDemo4  = new TreeDemo();
        treeDemo4.setId(5).setParentId(4).setLevel(5).setLevelName("E").setIsEfficient(1).setIsShow(1);

        TreeDemo treeDemo5  = new TreeDemo();
        treeDemo5.setId(6).setParentId(0).setLevel(1).setLevelName("A1").setIsEfficient(1).setIsShow(1);
        TreeDemo treeDemo6  = new TreeDemo();
        treeDemo6.setId(7).setParentId(6).setLevel(2).setLevelName("B1").setIsEfficient(1).setIsShow(1);
        TreeDemo treeDemo7  = new TreeDemo();
        treeDemo7.setId(8).setParentId(7).setLevel(3).setLevelName("C1").setIsEfficient(1).setIsShow(1);
        TreeDemo treeDemo8  = new TreeDemo();
        treeDemo8.setId(9).setParentId(8).setLevel(4).setLevelName("D1").setIsEfficient(1).setIsShow(1);
        TreeDemo treeDemo9  = new TreeDemo();
        treeDemo9.setId(10).setParentId(9).setLevel(5).setLevelName("E1").setIsEfficient(1).setIsShow(1);

        TreeDemo treeDemo10  = new TreeDemo();
        treeDemo10.setId(11).setParentId(7).setLevel(3).setLevelName("C2").setIsEfficient(1).setIsShow(1);
        TreeDemo treeDemo11  = new TreeDemo();
        treeDemo11.setId(12).setParentId(8).setLevel(4).setLevelName("D2").setIsEfficient(1).setIsShow(1);
        TreeDemo treeDemo12  = new TreeDemo();
        treeDemo12.setId(13).setParentId(9).setLevel(5).setLevelName("E2").setIsEfficient(1).setIsShow(1);

        treeDemoList.add(treeDemo);
        treeDemoList.add(treeDemo1);
        treeDemoList.add(treeDemo2);
        treeDemoList.add(treeDemo3);
        treeDemoList.add(treeDemo4);
        treeDemoList.add(treeDemo5);
        treeDemoList.add(treeDemo6);
        treeDemoList.add(treeDemo7);
        treeDemoList.add(treeDemo8);
        treeDemoList.add(treeDemo9);
        treeDemoList.add(treeDemo10);
        treeDemoList.add(treeDemo11);
        treeDemoList.add(treeDemo12);

        return treeDemoList;
    }

    /**
     *  1.2:將源資料轉化為樹結構資料
     */
    public static List<Tree<Integer>> transform(List<TreeDemo> treeDemoList){
        treeDemoList=initTreeDemo();
        // 2.配置
        TreeNodeConfig config = new TreeNodeConfig();
        //預設為id可以不設定
        config.setIdKey("id");
        //預設為parentId可以不設定
        config.setParentIdKey("parentId");
        //最大遞迴深度
        config.setDeep(5);
        //排序欄位
        config.setWeightKey("level");

        // 3.轉樹,Tree<>裡面泛型為id的型別
        List<Tree<Integer>> build = TreeUtil.build(treeDemoList, 0, config, (object, tree) -> {
            // 也可以使用 tree.setId(object.getId());等一些預設值
            tree.putExtra("id", object.getId());
            tree.putExtra("parentId", object.getParentId());
            tree.putExtra("level", object.getLevel());
            tree.putExtra("levelName", object.getLevelName());
            tree.putExtra("isEfficient", object.getIsEfficient());
            tree.putExtra("isShow", object.getIsShow());
        });
        System.out.println("將源資料轉化為樹:"+JSONUtil.toJsonStr(build));
        return build;
    }


    /**
     * @desc  2.1 子節點查詢父節點(此功能自己實現可以用treeUtil裡面的getParentsName)
     *
     *  實現思路:1、獲取指定節點
     *          2、將全部節點轉化為map,id做key
     *          3、遞迴迴圈向上匹配 知道物件為空
     */
    public static List<TreeDemo> childToParent(List<TreeDemo> treeDemoList, List<Tree<Integer>> build){
		//定義指定節點
        TreeDemo treeDemo9  = new TreeDemo();
        treeDemo9.setId(10).setParentId(9).setLevel(5).setLevelName("E1").setIsEfficient(1).setIsShow(1);
		//通過set新增查詢後的實體
        final Set<TreeDemo> nodeList = new HashSet<>();
		//將源資料轉化為map
        final Map<Integer, TreeDemo> allMap = treeDemoList.stream().collect(Collectors.toMap(TreeDemo::getId, Function.identity(), (v1, v2) -> v2));
	
//        build.forEach(node -> {
        findParent(nodeList, treeDemo9, allMap);
//        });
        List<TreeDemo> nodes = new ArrayList<>(nodeList);

        System.out.println("子節點找父節點:"+JSONUtil.toJsonStr(nodes));
        return nodes;
    }

    /**
     * :2.2遞迴查詢父節點
     */
    private static void findParent(Set<TreeDemo> nodeList, TreeDemo current, Map<Integer, TreeDemo> allMap) {
        if (Objects.nonNull(current)) {
            nodeList.add(current);
        }
        if (Objects.nonNull(current)) {
            TreeDemo parent = allMap.get(current.getParentId());
            findParent(nodeList, parent, allMap);
        }
    }

    /**
     * @desc  通過指定3:節點查詢子節點
     */
    public static Tree<Integer> parentToChile( List<Tree<Integer>> build){
        Tree<Integer> childNode = new Tree<>();
        for(Tree node : build){
            childNode=TreeUtil.getNode(node,6);
            if(Objects.nonNull(childNode)){
                break;
            }
        }
        System.out.println("查詢父節點及其子節點:"+JSONUtil.toJsonStr(childNode));
        return childNode;
    }