【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": "天津市"
}
]
}
]