记录:在Java后台利用递归思路进行构建树形结构数据,返回给前端,能以下拉菜单等形式进行展示。

简明:为了简化代码,引入Lombok的Jar包,可省略实体类set()、get()方法。

       <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.12</version></dependency>

一、树节点数据类

import lombok.Getter;
import lombok.Setter;import java.util.List;/***  TreeNode 树节点 (定义每一个节点的信息,即每一个节点对应一条数据信息)**  @author LBF*  @date 2022/1/10 16:46*/
@Setter
@Getter
public class TreeNode {/** 节点ID */private Integer id;/** 父节点ID:顶级节点为0 */private Integer parentId;/** 节点名称 */private String label;/** 子节点 */private List<TreeNode> children;public TreeNode(Integer id, Integer parentId, String label) {this.id = id;this.parentId = parentId;this.label = label;}
}

二、构建树形类

理解思路(个人):

1、首先获取所有的根节点(顶级节点),即根节点的parentId = 0。
2、根据每一个根节点,与所有节点集合(数据)进行判断,当前节点是否为其下的子节点。
3、若是,则递归调用构建树形;若不是,则表明该节点不属于其下子节点。
4、应继续循环判断节点父子关系,直到所有节点与根节点判断完毕。

import java.util.ArrayList;
import java.util.List;/***  BuildTree 构建树形结构**  @author LBF*  @date 2022/1/10 17:06*/
public class TreeBuild {// 保存参与构建树形的所有数据(通常数据库查询结果)public List<TreeNode> nodeList = new ArrayList<>();/***  构造方法*  @param nodeList 将数据集合赋值给nodeList,即所有数据作为所有节点。*/public TreeBuild(List<TreeNode> nodeList){this.nodeList = nodeList;}/***   获取需构建的所有根节点(顶级节点) "0"*   @return 所有根节点List集合*/public List<TreeNode> getRootNode(){// 保存所有根节点(所有根节点的数据)List<TreeNode> rootNodeList = new ArrayList<>();// treeNode:查询出的每一条数据(节点)for (TreeNode treeNode : nodeList){// 判断当前节点是否为根节点,此处注意:若parentId类型是String,则要采用equals()方法判断。if (0 == treeNode.getParentId()) {// 是,添加rootNodeList.add(treeNode);}}return rootNodeList;}/***  根据每一个顶级节点(根节点)进行构建树形结构*  @return  构建整棵树*/public List<TreeNode> buildTree(){// treeNodes:保存一个顶级节点所构建出来的完整树形List<TreeNode> treeNodes = new ArrayList<TreeNode>();// getRootNode():获取所有的根节点for (TreeNode treeRootNode : getRootNode()) {// 将顶级节点进行构建子树treeRootNode = buildChildTree(treeRootNode);// 完成一个顶级节点所构建的树形,增加进来treeNodes.add(treeRootNode);}return treeNodes;}/***  递归-----构建子树形结构*  @param  pNode 根节点(顶级节点)*  @return 整棵树*/public TreeNode buildChildTree(TreeNode pNode){List<TreeNode> childTree = new ArrayList<TreeNode>();// nodeList:所有节点集合(所有数据)for (TreeNode treeNode : nodeList) {// 判断当前节点的父节点ID是否等于根节点的ID,即当前节点为其下的子节点if (treeNode.getParentId().equals(pNode.getId())) {// 再递归进行判断当前节点的情况,调用自身方法childTree.add(buildChildTree(treeNode));}}// for循环结束,即节点下没有任何节点,树形构建结束,设置树结果pNode.setChildren(childTree);return pNode;}}

三、测试案例

import com.lbf.common.core.domain.AjaxResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;
import java.util.List;/***  TreeController 树控制层*  方式:传递所有数据集合作为参数,调用buildTree()构建树形。**  @author LBF*  @date 2022/1/10 17:49*/
@RestController
@RequestMapping("/tree")
public class TreeController {@GetMapping("/treeTest")public AjaxResult treeTest(){// 模拟测试数据(通常为数据库的查询结果)List<TreeNode> treeNodeList = new ArrayList<>();treeNodeList.add(new TreeNode(1,0,"顶级节点A"));treeNodeList.add(new TreeNode(2,0,"顶级节点B"));treeNodeList.add(new TreeNode(3,1,"父节点是A"));treeNodeList.add(new TreeNode(4,2,"父节点是B"));treeNodeList.add(new TreeNode(5,2,"父节点是B"));treeNodeList.add(new TreeNode(6,3,"父节点的ID是3"));// 创建树形结构(数据集合作为参数)TreeBuild treeBuild = new TreeBuild(treeNodeList);// 原查询结果转换树形结构treeNodeList = treeBuild.buildTree();// AjaxResult:个人封装返回的结果体return AjaxResult.success("测试数据",treeNodeList);}
}

四、测试结果

五、总结

本文介绍Java后台构建树形结构数据的设计思路及实现,在设计过程中,仍然存在许多未能充分理解的位置,若存在错误或更好实现方案,可分享/指出,共同学习进步。

Java后端递归构建树形结构相关推荐

  1. java构建树形结构

    目录 前言 实现树形结构 一.树节点数据类(反回参数类) 二.给树形结构添加数据 三.测试类 四.测试结果 前言 在我们实际开发中会接触到树形结构,根节点子节点, 然后添加数据构成了我们的树形结构, ...

  2. java arraylist 遍历树_Java递归遍历树形结构

    废话不多说了,直接给大家贴代码,具体代码如下所示://菜单树形结构 public JSONArray treeMenuList(JSONArray menuList, int parentId) { ...

  3. Java8新特性-使用Stream流来实现递归遍历树形结构(案例)

    Java8新特性-Stream流 可能平常会遇到一些需求,比如构建菜单,构建树形结构,数据库一般就使用父id来表示,为了降低数据库的查询压力,我们可以使用Java8中的Stream流一次性把数据查出来 ...

  4. java后端项目整体代码结构

    文章目录 前言 一.java后端项目整体代码结构是什么样子的? 二.写完咋调试呢? 总结 前言 作为第一次参加java项目,在接触项目的第一周里也是遇到各种傻白的问题,如项目代码文件的整个结构是什么样 ...

  5. 利用Stram来递归生成树形结构

    利用Stram来递归生成树形结构 当需要查询有子菜单,或者子部门这一类需要形成树形的数据时,我们可以使用stream流式编程写 实体类 实体类需要有一个子列,类似此处的子城市 @Data @Equal ...

  6. java 构建树形结构_Java求助:如何建立一个树形结构

    在Java中如何实现一个如下的树形结构:root/|\year_2009year_2008year_2007,etc/|||month_1month_2month_1month_1|\|/\|day1 ...

  7. java—stream流递归实现树形结构

    一.在项目开发中,经常会遇到像菜单式的页面,如下图 数据表结构一般像一个树形结构一样 对应的Model体 @Data //代替get.set方法 @ApiModel("知识园地视图" ...

  8. java读取文件目录返回树形结构

    为实现读取文件目录下的文件信息,生成树形结构,以方便前端做一些展示 1.结构实体类 package cn.cnic.instdb.model.system;import lombok.Data; im ...

  9. C++ Qt 构建树形结构 树形结构生成XML

    树形数据结构是一类重要的非线性数据结构.树形数据结构可以表示数据表素之间一对多的关系.其中以树与二叉树最为常用,直观看来,树是以分支关系定义的层次结构.树形数据结构在客观世界中广泛存在,如人类社会的族 ...

最新文章

  1. matlab 互信息函数,MATLAB 互信息函数
  2. Nginx之https配置
  3. win32文件读写demo
  4. html中红色星号,谨慎使用CSS中的星号(*)通配符
  5. 为了方便大家下载四级资料,开通FTP
  6. Vite+Vue3页面空白、图标不显示问题解决
  7. Linux 释放缓存的方法
  8. 影响中国历史的十篇政治美文
  9. Java并发编程实战~CountDownLatch
  10. echarts 柱状图不显示y坐标轴_Python+matplotlib自定义坐标轴位置、颜色、箭头
  11. NYOJ-喷水装置(一)(贪心)
  12. IE的@cc_on条件编译
  13. mybatis一对多和多对一
  14. AWVS13破解docker一键安装
  15. 项目管理中,制定项目进度计划有何意义?
  16. 碧蓝航线频道和服务器所在的文件夹,碧蓝航线如何反和谐 反和谐方法
  17. word修改正文样式影响标题样式
  18. 小米手机连接电脑只能看到部分相片_小米手机连接电脑后怎么看照片
  19. The Perfect Match: 3D Point Cloud Matching with Smoothed Densities
  20. android打开iso,安卓手机端如何运行iso镜像文件

热门文章

  1. 因子IC、IR信息系数和信息比率的介绍
  2. 一个让客户惊呼救急的BLDC电机驱动案例
  3. 工具介绍:ITerm 2
  4. 51单片机数字电子钟设计(数电课设,含时间显示、校准、整点报时、闹钟功能)
  5. 【分享】vofa+串口调试助手
  6. UnityVR--小程序3--金色的子弹1
  7. PostgreSQL修炼之道之PostgreSQL的核心架构(十一)
  8. Flutter中基于Dio实现Token Refresh
  9. 黑马程序员——开发工具——Eclipse
  10. 浅谈自己理解的几种设计模式