概述
在项目中,我们经常涉及单张表数据进行树形目录结构展示(即具有层级关系的数据结构),比如菜单层级展示、商品分类展示等。
思路
单张表之间要具备层级关系,必然会有能体现父子之间的字段,比如常见的id和parentId
比如这样一张表

pid为0时即为最高层级,pid为 1366的是id为1366的孩子,在上面的体现是裤子和上衣都在衣服这一个分类下面
要实现这张表树形结构的展示,我们一方面得在该表对应的实体类里添加一个自身的集合childList作为其孩子的集合。
具体实现
这里我是将它封装成一个工具类使用。
注意:这里默认表里的父级字段为 parentId
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
@Data public class TreeNode<C extends TreeNode<?>>{
private String parentId;
@TableField(exist = false) private List<TreeNode> children; }
|
工具类实现树形结构的展示(递归思想找子节点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
|
public static <T extends TreeNode>List<T> build(List<T> treeNodes, String parentId){ if (parentId == null){ return null; } List<T> rootNodes = new ArrayList<>(); for (T t : treeNodes){ if (parentId.equals(t.getParentId())){ rootNodes.add(t); } } for (T t : rootNodes){ t.setChildren(getChildNodes(t,treeNodes)); } return rootNodes; }
private static <T extends TreeNode>List<TreeNode> getChildNodes(TreeNode t,List<T> treeNodes){ List<TreeNode> childNodes = new ArrayList<>(); for (TreeNode t1 : treeNodes){ if (t1.getParentId().equals(t.getId())){ childNodes.add(t1); } } if (childNodes.size() == 0){ return null; } for (TreeNode t1 : childNodes){ t1.setChildren(getChildNodes(t1,treeNodes)); } return childNodes; }
|
总结
要实现树形结构的步骤:
- 表设计要有父子级关系(一般用 id 和 parentId)
- 实体要新增 子节点 的集合变量,一般用List接收
- 查找获得所有符合要求的数据,通过遍历得到 父节点集合,遍历父节点集合,遍历子节点结合,父节点的id和子节点的父id相等时,说明该节点数属于当前父节点的孩子,将其放入父节点的孩子集合中,遍历结束后,将子节点集合赋值给 集合变量。(这里用递归思想实现)