记录

目录

  • 记录
  • 前言
  • 一、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 表格 工具类