Hutool TreeUtil工具使用,将数组数据转为树形结构(如将全国省份数组按parentid转为树形)

maven pom:


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

第一种方式构建Tree

public static void main(String[] args) {
        
    // 构建node列表(数据源)
    List<TreeNode<String>> nodeList = CollUtil.newArrayList();
    nodeList.add(new TreeNode<>("1", "0", "系统管理", 5));
    nodeList.add(new TreeNode<>("11", "1", "用户管理", 222222));
    nodeList.add(new TreeNode<>("111", "11", "用户添加", 0));
    nodeList.add(new TreeNode<>("2", "0", "店铺管理", 1));
    nodeList.add(new TreeNode<>("21", "2", "商品管理", 44));
    nodeList.add(new TreeNode<>("221", "2", "商品管理2", 2));
    // 0表示最顶层的id是0
    List<Tree<String>> treeList = TreeUtil.build(nodeList, "0");
    System.out.println(JSON.toJSONString(treeList));
}

第二种自定义字段名

public static void main(String[] args) {
    //配置
    TreeNodeConfig treeNodeConfig = new TreeNodeConfig();
    // 自定义属性名
    treeNodeConfig.setWeightKey("order"); // 权重排序字段 默认为weight
    treeNodeConfig.setIdKey("id"); // 默认为id可以不设置
    treeNodeConfig.setNameKey("name"); // 节点名对应名称 默认为name
    treeNodeConfig.setParentIdKey("parentId"); // 父节点 默认为parentId
    treeNodeConfig.setChildrenKey("children"); // 子点 默认为children
    treeNodeConfig.setDeep(3); // 可以配置递归深度 从0开始计算 默认此配置为空,即不限制
    //数据源
    List<Student> nodeList = list();
    //转换器 "0" - 最顶层父id值 一般为0之类  nodeList – 源数据集合
    List<Tree<String>> treeNodes = TreeUtil.build(nodeList, "0", treeNodeConfig,
        // treeNode – 源数据实体
        // tree – 树节点实体
        (treeNode, tree) -> {
            tree.setId(treeNode.getId());
            tree.setParentId(treeNode.getParentId());
            tree.setWeight(treeNode.getWeight());
            tree.setName(treeNode.getName());
            // 扩展属性 ...
            tree.putExtra("extraField", 666);
            tree.putExtra("other", new Object());
    System.out.println(JSON.toJSONString(treeNodes));
}

实战(将省市数组转为树形):

省市list:

  {
            "city_level": "CITY_LEVEL_NONE",
            "parent_name": "",
            "parent_id": 0,
            "name": "中国未知",
            "id": 156
        },
        {
            "city_level": "CITY_LEVEL_NONE",
            "parent_name": "",
            "parent_id": 0,
            "name": "台湾省",
            "id": 710000
        },
        {
            "city_level": "CITY_LEVEL_NONE",
            "parent_name": "台湾省",
            "parent_id": 710000,
            "name": "台湾省未知",
            "id": 719900
        },
        {
            "city_level": "CITY_LEVEL_NONE",
            "parent_name": "台湾省",
            "parent_id": 710000,
            "name": "高雄市",
            "id": 710200
        },
        {
            "city_level": "CITY_LEVEL_NONE",
            "parent_name": "台湾省",
            "parent_id": 710000,
            "name": "花莲县",
            "id": 712200
        },
        {
            "city_level": "CITY_LEVEL_NONE",
            "parent_name": "台湾省",
            "parent_id": 710000,
            "name": "嘉义市",
            "id": 710700
        },
        {
            "city_level": "CITY_LEVEL_NONE",
            "parent_name": "台湾省",
            "parent_id": 710000,
            "name": "南投县",
            "id": 711500
        },
        {
            "city_level": "CITY_LEVEL_NONE",
            "parent_name": "台湾省",
            "parent_id": 710000,
            "name": "澎湖县",
            "id": 712300
        },
        {
            "city_level": "CITY_LEVEL_NONE",
            "parent_name": "台湾省",
            "parent_id": 710000,
            "name": "屏东县",
            "id": 712000
        },
        {
            "city_level": "CITY_LEVEL_NONE",
            "parent_name": "台湾省",
            "parent_id": 710000,
            "name": "台北市",
            "id": 710100
        },

设置实体类接收:

@Data
public class GdtCityVo {

    private Integer id;

    private Integer parentId;

    private String name;

    private String cityLevel;

    private List<GdtCityVo> childrenList;
}

使用工具类实现:

 List<GdtCityVo> gdtCityList = JSON.parseArray(JSONObject.toJSONString(data.get("list")), GdtCityVo.class);
//接收媒体返回省市实体类
 TreeNodeConfig config = new TreeNodeConfig();
        config.setDeep(4);//设置深度层级
        config.setChildrenKey("childrenList");
        List<Tree<Integer>> build = TreeUtil.build(gdtCityList, 0, config, (object, tree) -> {

            // 也可以使用 tree.setId(object.getId());等一些默认值
            //这里使用反射挨个赋值
            Field[] fields = ReflectUtil.getFieldsDirectly(object.getClass(), true);
            for (Field field : fields) {

                String fieldName = field.getName();
                Object fieldValue = ReflectUtil.getFieldValue(object, field);
                tree.putExtra(fieldName, fieldValue);
            }
        });
        return build;

返回数据类型

 "data": [
        {
            "id": 156,
            "parentId": 0,
            "name": "中国未知",
            "cityLevel": "CITY_LEVEL_NONE",
            "childrenList": null
        },
        {
            "id": 500000,
            "parentId": 0,
            "name": "重庆市",
            "cityLevel": "CITY_LEVEL_SECOND",
            "childrenList": [
                {
                    "id": 500103,
                    "parentId": 500000,
                    "name": "渝中区",
                    "cityLevel": "CITY_LEVEL_NONE",
                    "childrenList": null
                },
                {
                    "id": 500102,
                    "parentId": 500000,
                    "name": "涪陵区",
                    "cityLevel": "CITY_LEVEL_NONE",
                    "childrenList": null
                },
                {
                    "id": 500101,
                    "parentId": 500000,
                    "name": "万州区",
                    "cityLevel": "CITY_LEVEL_NONE",
                    "childrenList": null
                },
                {
                    "id": 500111,
                    "parentId": 500000,
                    "name": "大足区",
                    "cityLevel": "CITY_LEVEL_NONE",
                    "childrenList": null
                },
                {
                    "id": 500110,
                    "parentId": 500000,
                    "name": "綦江区",
                    "cityLevel": "CITY_LEVEL_NONE",
                    "childrenList": null
                },

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值