记录
目录
- 记录
- 前言
- 一、TreeNode 通用树结构使用
- 1. 创建TreeNode树结构基础类
- 2. 创建通用树结构构建类
- 二、使用步骤
- 1.通过调用构建类返回树结构
- 2.测试
- 总结
前言
本文档基于若依框架编写
项目地址:https://gitee/y_project/RuoYi-Cloud
提示:以下是本篇文章正文内容,下面案例可供参考
一、TreeNode 通用树结构使用
日常开发经常会遇到此类表单
那么这种树结构是如何实现的呢
若依框架中给出了实现(贴出部分代码):
菜单树
部门树
对此做稍稍改动
1. 创建TreeNode树结构基础类
/**
* @author
* @description TODO
* @date 2022/5/5 17:27
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TreeNode<T> {
/**
* 节点ID
*/
private Integer id;
/**
* 父节点ID:顶级节点为0
*/
private Integer parentId;
/**
* 节点名称
*/
private String name;
/**
* 子节点
*/
private List<T> children = new ArrayList<>();
}
2. 创建通用树结构构建类
/**
* @author
* @description TODO
* @date 2022/5/5 17:29
*/
public class TreeBuild {
public List<TreeNode> nodeList = new ArrayList<>();
/**
* 构造方法
*
* @param nodeList 将数据集合赋值给nodeList,即所有数据作为所有节点。
*/
public TreeBuild(List<TreeNode> nodeList) {
this.nodeList = nodeList;
}
/**
* 构建前端所需要树结构
*
* @return 树结构列表
*/
public List<TreeNode> buildTree() {
List<TreeNode> returnList = new ArrayList<>();
List<Integer> tempList = new ArrayList<>();
for (TreeNode node : nodeList) {
tempList.add(node.getId());
}
for (Iterator<TreeNode> iterator = nodeList.iterator(); iterator.hasNext(); ) {
TreeNode node = iterator.next();
// 如果是顶级节点, 遍历该父节点的所有子节点
if (!tempList.contains(node.getParentId())) {
recursionFn(nodeList, node);
returnList.add(node);
}
}
if (returnList.isEmpty()) {
returnList = nodeList;
}
return returnList;
}
/**
* 递归列表
*/
private void recursionFn(List<TreeNode> list, TreeNode t) {
// 得到子节点列表
List<TreeNode> childList = getChildList(list, t);
t.setChildren(childList);
for (TreeNode tChild : childList) {
if (hasChild(list, tChild)) {
// 判断是否有子节点
Iterator<TreeNode> it = childList.iterator();
while (it.hasNext()) {
TreeNode n = it.next();
recursionFn(list, n);
}
}
}
}
/**
* 得到子节点列表
*/
private List<TreeNode> getChildList(List<TreeNode> list, TreeNode t) {
List<TreeNode> tlist = new ArrayList<>();
Iterator<TreeNode> it = list.iterator();
while (it.hasNext()) {
TreeNode n = it.next();
if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getId().longValue()) {
tlist.add(n);
}
}
return tlist;
}
/**
* 判断是否有子节点
*/
private boolean hasChild(List<TreeNode> list, TreeNode t) {
return getChildList(list, t).size() > 0 ? true : false;
}
}
二、使用步骤
1.通过调用构建类返回树结构
代码如下(示例):
@Override
public List<TreeNode> selectPermissionList(String param,Integer type) {
//业务返回列表数据
List<SysUserPermissionVo> list = sysUserPermissionMapper.selectPermissionList(param,type);
List<TreeNode> treeNodeList = new ArrayList<>(list);
TreeBuild treeBuild = new TreeBuild(treeNodeList);
return treeBuild.buildTree();
}
SysUserPermissionVo 业务查询返回的数据类
@Data
@ApiModel("列表返回类")
public class SysUserPermissionVo extends TreeNode<SysUserPermissionVo> {
......业务字段
}
2.测试
调用接口
返回:
总结
本帖仅提供学习参考,最重要的是理解它的实现方法,以及递归的运用。
更多推荐
Java 树结构 TreeNode 表格 工具类
发布评论