【Hutool】之树形结构

Hutool TreeUtil工具使用,构建树形结构数据

依赖

hutool

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

fastjson

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.32</version>
        </dependency>

基础(使用默认配置)

  • 代码
package com.myself;

import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.lang.tree.TreeNode;
import cn.hutool.core.lang.tree.TreeNodeConfig;
import cn.hutool.core.lang.tree.TreeUtil;
import com.alibaba.fastjson2.JSON;
import lombok.extern.slf4j.Slf4j;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import springfox.documentation.spring.web.json.Json;

import java.util.ArrayList;
import java.util.List;

@Slf4j
@SpringBootTest(classes = Application.class)
@RunWith(SpringRunner.class)
public class ApplicationTest {

    public static void main(String[] args) throws Exception {

        List<TreeNode<String>> nodeList = new ArrayList<>();

        nodeList.add(new TreeNode<>("1","0","总菜单",1));
        nodeList.add(new TreeNode<>("2","1","一级菜单1",1));
        nodeList.add(new TreeNode<>("3","1","一级菜单2",1));
        nodeList.add(new TreeNode<>("4","2","二级菜单1-1",1));
        nodeList.add(new TreeNode<>("5","2","二级菜单1-2",1));
        nodeList.add(new TreeNode<>("6","3","二级菜单2-1",1));
        nodeList.add(new TreeNode<>("7","3","二级菜单2-2",1));
        nodeList.add(new TreeNode<>("8","3","二级菜单2-3",1));

        List<Tree<String>> treeList = TreeUtil.build(nodeList, "0");

        System.out.println(JSON.toJSONString(treeList));

    }

}

  • 输出结果
[
    {
        "id": "1",
        "parentId": "0",
        "weight": 1,
        "name": "总菜单",
        "children": [
            {
                "id": "2",
                "parentId": "1",
                "weight": 1,
                "name": "一级菜单1",
                "children": [
                    {
                        "id": "4",
                        "parentId": "2",
                        "weight": 1,
                        "name": "二级菜单1-1"
                    },
                    {
                        "id": "5",
                        "parentId": "2",
                        "weight": 1,
                        "name": "二级菜单1-2"
                    }
                ]
            },
            {
                "id": "3",
                "parentId": "1",
                "weight": 1,
                "name": "一级菜单2",
                "children": [
                    {
                        "id": "6",
                        "parentId": "3",
                        "weight": 1,
                        "name": "二级菜单2-1"
                    },
                    {
                        "id": "7",
                        "parentId": "3",
                        "weight": 1,
                        "name": "二级菜单2-2"
                    },
                    {
                        "id": "8",
                        "parentId": "3",
                        "weight": 1,
                        "name": "二级菜单2-3"
                    }
                ]
            }
        ]
    }
]

扩展(自定义配置)

  • 代码
package com.myself;

import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.lang.tree.TreeNode;
import cn.hutool.core.lang.tree.TreeNodeConfig;
import cn.hutool.core.lang.tree.TreeUtil;
import com.alibaba.fastjson2.JSON;
import lombok.extern.slf4j.Slf4j;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import springfox.documentation.spring.web.json.Json;

import java.util.*;

@Slf4j
@SpringBootTest(classes = Application.class)
@RunWith(SpringRunner.class)
public class ApplicationTest {

    public static void main(String[] args) throws Exception {

        //配置
        TreeNodeConfig treeNodeConfig = new TreeNodeConfig();
        //自定义属性名
        treeNodeConfig.setWeightKey("level"); // 权重排序字段 默认为weight
        treeNodeConfig.setIdKey("id"); // 默认为id可以不设置
        treeNodeConfig.setNameKey("name"); // 节点名对应名称 默认为name
        treeNodeConfig.setParentIdKey("parent_id"); // 父节点 默认为parentId
        treeNodeConfig.setChildrenKey("child"); // 子点 默认为children
        treeNodeConfig.setDeep(2); // 可以配置递归深度 从0开始计算 默认此配置为空,即不限制
        //数据源
        List<Map<String,Object>> nodeList = new ArrayList<>();
        HashMap<String, Object> map1 = new HashMap<String, Object>() {{
            put("id","1001000000");
            put("name","北京市");
            put("level",1);
            put("parent_id","000000");
            put("parent_name","中国");
        }};
        nodeList.add(map1);

        HashMap<String, Object> map2 = new HashMap<String, Object>() {{
            put("id","2001001000");
            put("name","东城区");
            put("level",2);
            put("parent_id","1001000000");
            put("parent_name","北京市");
        }};
        nodeList.add(map2);

        HashMap<String, Object> map3 = new HashMap<String, Object>() {{
            put("id","2001002000");
            put("name","西城区");
            put("level",2);
            put("parent_id","1001000000");
            put("parent_name","北京市");
        }};
        nodeList.add(map3);

        HashMap<String, Object> map4 = new HashMap<String, Object>() {{
            put("id","1002000000");
            put("name","天津市");
            put("level",1);
            put("parent_id","000000");
            put("parent_name","中国");
        }};
        nodeList.add(map4);

        HashMap<String, Object> map5 = new HashMap<String, Object>() {{
            put("id","2002001000");
            put("name","和平区");
            put("level",2);
            put("parent_id","1002000000");
            put("parent_name","天津市");
        }};
        nodeList.add(map5);


        //nodeList–源数据集合 "000000"-顶级父类ID treeNodeConfig-自定义配置类
        List<Tree<String>> treeList = TreeUtil.build(nodeList, "000000", treeNodeConfig,
                // treeNode – 源数据实体  tree – 树节点实体
                (treeNode, tree) -> {
                    tree.setId(treeNode.get("id").toString());
                    tree.setParentId(treeNode.get("parent_id").toString());
                    tree.setWeight(treeNode.get("level").toString());
                    tree.setName(treeNode.get("name").toString());
                    // 扩展属性 ...
                    tree.putExtra("parent_name", treeNode.get("parent_name").toString());
                }
        );

        System.out.println(JSON.toJSONString(treeList));

    }

}

  • 输出结果
[
    {
        "id": "1001000000",
        "parent_id": "000000",
        "level": "1",
        "name": "北京市",
        "parent_name": "中国",
        "child": [
            {
                "id": "2001001000",
                "parent_id": "1001000000",
                "level": "2",
                "name": "东城区",
                "parent_name": "北京市"
            },
            {
                "id": "2001002000",
                "parent_id": "1001000000",
                "level": "2",
                "name": "西城区",
                "parent_name": "北京市"
            }
        ]
    },
    {
        "id": "1002000000",
        "parent_id": "000000",
        "level": "1",
        "name": "天津市",
        "parent_name": "中国",
        "child": [
            {
                "id": "2002001000",
                "parent_id": "1002000000",
                "level": "2",
                "name": "和平区",
                "parent_name": "天津市"
            }
        ]
    }
]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值