概述:在项目中,我们经常涉及单张表数据进行树形目录结构展示(即具有层级关系的数据结构),比如菜单层级展示、商品分类展示等。
1.如下图我们按照这样方式创建一个表
2.这里我是将它封装成一个工具类使用。
注意:这里默认表里的父级字段为 parentId
@Data
public class TreeNode implements Serializable {
protected Long id;
protected Long parentId;
protected List<TreeNode> children = new ArrayList<TreeNode>();
public void add(TreeNode node) {
children.add(node);
}
}
@UtilityClass
public class TreeUtil {
/**
* 两层循环实现建树
*
* @param treeNodes 传入的树节点列表
* @return
*/
public <T extends TreeNode> ArrayList<T> build(List<T> treeNodes, Object root) {
ArrayList<T> trees = new ArrayList<>();
if (root == null) {
return trees;
}
for (T treeNode : treeNodes) {
if (root.toString().equals(treeNode.getParentId().toString())) {
trees.add(treeNode);
}
for (T it : treeNodes) {
if (it.getParentId().equals(treeNode.getId())) {
if (treeNode.getChildren() == null) {
treeNode.setChildren(new ArrayList<>());
}
treeNode.add(it);
}
}
}
return trees;
}
/**
* 使用递归方法建树
*
* @param treeNodes
* @return
*/
public <T extends TreeNode> List<T> buildByRecursive(List<T> treeNodes, Object root) {
List<T> trees = new ArrayList<T>();
for (T treeNode : treeNodes) {
if (root.equals(treeNode.getParentId())) {
trees.add(findChildren(treeNode, treeNodes));
}
}
return trees;
}
/**
* 递归查找子节点
*
* @param treeNodes
* @return
*/
public <T extends TreeNode> T findChildren(T treeNode, List<T> treeNodes) {
for (T it : treeNodes) {
if (treeNode.getId() == it.getParentId()) {
if (treeNode.getChildren() == null) {
treeNode.setChildren(new ArrayList<>());
}
treeNode.add(findChildren(it, treeNodes));
}
}
return treeNode;
}
}
结尾:干货分享,喜欢就点个赞收藏吧