一、演示TreeUtil工具类使用
package com.core.treenode.demo.temp.hutTreeNode;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.lang.tree.TreeNodeConfig;
import cn.hutool.core.lang.tree.TreeUtil;
import com.alibaba.fastjson.JSON;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* Hutool树结构操作工具类示例,主要演示使用TreeUtil构建树状结构数据并进行相关配置及处理。
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class HutoolTreeUtilClothDemo {
private Integer id;
private String name;
private Integer pid;
private String desc;
private Integer sort;
// 子目录列表
private List<HutoolTreeUtilClothDemo> treeNode;
/**
* 构建树状结构数据并转换为JSON字符串输出的主函数,用于演示如何使用Hutool的TreeUtil工具类将扁平化数据转换为树状结构,
* 同时配置返回数据的格式,并对节点进行额外属性设置和排序处理。
*
* @param args 命令行参数,在此示例中未使用
*/
public static void main(String[] args) {
try {
// 构建数据【层叠数据】,模拟原始的扁平化数据列表,后续将基于此构建树状结构
List<HutoolTreeUtilClothDemo> lists = CollUtil.newArrayList();
lists.add(new HutoolTreeUtilClothDemo(1, "顶级目录1", 0, "顶级目录", 0, null));
lists.add(new HutoolTreeUtilClothDemo(2, "一级目录1", 1, "父目录01", 1, null));
lists.add(new HutoolTreeUtilClothDemo(3, "一级目录2", 1, "父目录01", 3, null));
lists.add(new HutoolTreeUtilClothDemo(4, "一级目录3", 1, "父目录01", 2, null));
System.out.println("【原始数据】JSON.toJSONString(lists) = " + JSON.toJSONString(lists));
// 配置返回JSON数据【类似取别名】,设置返回树状结构数据中节点的关键属性名称
TreeNodeConfig config = new TreeNodeConfig();
config.setIdKey("id_rest");
config.setNameKey("name_rest");
// 定义根节点值,用于确定树状结构的起始节点
String rootId = "0";
List<Tree<String>> list = buildTreeAndProcessNodes(lists, rootId, config);
System.out.println("【处理完成】JSON.toJSONString(list) = " + JSON.toJSONString(list));
} catch (Exception e) {
// 捕获任何可能出现的异常,并打印异常信息,便于调试和排查问题
System.err.println("在构建树状结构或处理过程中出现异常: " + e.getMessage());
e.printStackTrace();
}
}
/**
* 使用Hutool的TreeUtil工具类构建树状结构数据,配置节点属性名称,并对节点进行额外属性设置和排序处理。
*
* @param dataList 数据源,即需要构建树状数据的原始扁平化数据列表,列表元素为HutoolTreeUtilClothDemo类型
* @param rootNodeId 根节点值,用于在原始数据中确定树状结构的起始节点,类型为String
* @param config 配置返回数据格式的对象,用于设置树状结构中节点的关键属性在JSON输出中的名称
* @return 构建好并经过处理的树状结构数据列表,每个元素表示树中的一个节点,以Tree<String>类型存储
*/
private static List<Tree<String>> buildTreeAndProcessNodes(List<HutoolTreeUtilClothDemo> dataList, String rootNodeId, TreeNodeConfig config) {
return TreeUtil.build(dataList, rootNodeId, config, (node, tree) -> {
tree.setId(node.getId().toString());
tree.setName(node.getName());
tree.setParentId(node.getPid().toString());
// 根据该字段排序,正序排列,数字越小越靠前
tree.setWeight(node.getSort());
// 额外的值【参与构建树的属性其实只包含: id、parentId】
tree.put("desc", node.getDesc());
tree.put("sort", node.getSort());
// 移除返回语句,因为NodeParser接口的实现应该是void类型,不返回值
});
}
}
二、数据:
1、原始数据
[
{
"desc": "顶级目录",
"id": 1,
"name": "顶级目录1",
"pid": 0,
"sort": 0
},
{
"desc": "父目录01",
"id": 2,
"name": "一级目录1",
"pid": 1,
"sort": 1
},
{
"desc": "父目录01",
"id": 3,
"name": "一级目录2",
"pid": 1,
"sort": 3
},
{
"desc": "父目录01",
"id": 4,
"name": "一级目录3",
"pid": 1,
"sort": 2
}
]
2、处理完成数据
[
{
"id_rest": "1",
"name_rest": "顶级目录1",
"parentId": "0",
"weight": 0,
"desc": "顶级目录",
"sort": 0,
"children": [
{
"id_rest": "2",
"name_rest": "一级目录1",
"parentId": "1",
"weight": 1,
"desc": "父目录01",
"sort": 1
},
{
"id_rest": "4",
"name_rest": "一级目录3",
"parentId": "1",
"weight": 2,
"desc": "父目录01",
"sort": 2
},
{
"id_rest": "3",
"name_rest": "一级目录2",
"parentId": "1",
"weight": 3,
"desc": "父目录01",
"sort": 3
}
]
}
]