Java实现树形结构的示例代码
作者:小刘要努力 发布时间:2023-07-30 01:05:19
标签:Java,树形,结构
前言
由于业务需要,后端需要返回一个树型结构给前端,包含父子节点的数据已经在数据库中存储好,现在需要做的是如何以树型结构的形式返给给前端。
数据库表结构
实现思路
1、拿到有父子节点的集合数据
2、遍历集合数据,拿到所有的根节点
3、遍历根节点,拿到所有的子节点
4、递归子节点,将递归的子节点接上其父节点,直到子节点为空,递归完成
5、递归好后以集合形式返回,返回前端时以JSON格式转换后返回
具体代码
1、造数据,和数据库表数据一致
package com.lyq.generateTree;
import com.alibaba.fastjson.JSON;
import java.util.ArrayList;
import java.util.List;
/**
* @author : [LiuYanQiang]
* @version : [v1.0]
* @className : TreeMain
* @description : [描述说明该类的功能]
* @createTime : [2022/5/3 0:05]
* @updateUser : [LiuYanQiang]
* @updateTime : [2022/5/3 0:05]
* @updateRemark : [描述说明本次修改内容]
*/
public class TreeMain {
public static void main(String[] args) {
List<Tree> list = new ArrayList<>();
//造数据
list.add(new Tree("22650", "0", "第一周"));
list.add(new Tree("22651", "22650", "1.1 随堂练习:《你认为以下属于人工智能的是什么呢?》,时间:0.5min"));
list.add(new Tree("22652", "22650", "1.2 主题讨论:《使用循环代码块绘制正五角星》,时间:5min"));
list.add(new Tree("22653", "22650", "1.3 主题讨论:《延时测试》,时间:0.5min"));
list.add(new Tree("22654", "22650", "1.4 调查问卷:《测试延时时间》, 时间:0.5min"));
list.add(new Tree("22655", "22650", "1.5 研究与挑战:翟文彪老师开播啦,时间:1min,[N]"));
list.add(new Tree("22656", "22650", "1.6 研究与挑战:米新江教授开播啦,时间:1min,[N]"));
list.add(new Tree("22657", "22656", "1.6.1 研究与挑战:丁中文老师开播啦,时间:1min,[N]"));
list.add(new Tree("22658", "22656", "1.6.2 研究与挑战:郝晓军老师开播啦,时间:1min,[N]"));
list.add(new Tree("22659", "22656", "1.6.3 研究与挑战:张娟老师开播啦,时间:1min,[N]"));
list.add(new Tree("22660", "22656", "1.6.4 研究与挑战:王怀军老师开播啦,时间:1min,[N]"));
list.add(new Tree("22661", "22656", "1.6.5 研究与挑战:何操老师开播啦,时间:1min,[N]"));
list.add(new Tree("22662", "22656", "1.6.6 研究与挑战:武新丽老师开播啦,时间:1min,[N]"));
list.add(new Tree("22663", "22656", "1.6.7 一键签到:人脸识别,时间:2min"));
list.add(new Tree("22664", "22656", "1.6.8 手势签到:人脸识别22,时间:2min"));
list.add(new Tree("22665", "22656", "1.6.9 研究与挑战:吴欣明老师开播啦,时间:1min,[N]"));
list.add(new Tree("22666", "22656", "1.6.10 研究与挑战:程艳艳老师开播啦,时间:1min,[N]"));
list.add(new Tree("22667", "22656", "1.6.11 研究与挑战:本学期课程内容,时间:0.5min"));
list.add(new Tree("22668", "22656", "1.6.12 研究与挑战:米老师的教学团队介绍,时间:0.3min"));
list.add(new Tree("22669", "22650", "1.7 研究与挑战:米老师的教学团队介绍,时间:0.3min"));
list.add(new Tree("22670", "22650", "1.8 研究与挑战:米老师的教学团队介绍,时间:0.3min"));
list.add(new Tree("22671", "22650", "1.9 研究与挑战:助教机器人提醒您参与活动,时间:2min"));
list.add(new Tree("22672", "22650", "1.10 研究与挑战:AR系统使用教程-学生端,时间:5min"));
list.add(new Tree("22673", "22672", "1.10.1 研究与挑战:不一样的课堂修改版,时间:0.5min"));
list.add(new Tree("22674", "22673", "1.10.1.1 研究与挑战:下载AR APP,时间:8min"));
list.add(new Tree("22675", "22674", "1.10.1.1.1 研究与挑战:修改版手机端AR助教机器人的登录,时间:5min"));
list.add(new Tree("22676", "22674", "1.10.1.1.2 研究与挑战:app页面展示,时间:2min"));
list.add(new Tree("22677", "22674", "1.10.1.1.3 研究与挑战:使用网页版方式, 时间:3min"));
list.add(new Tree("22678", "22674", "1.10.1.1.4 研究与挑战:《使用学习通账号密码登录AR网页版》,时间:5min"));
list.add(new Tree("22679", "22674", "1.10.1.1.5 主题讨论:修改时间2022年4月4日《上传:进入AR网页版后的界面》,时间:3min"));
list.add(new Tree("22680", "22673", "1.10.1.2 研究与挑战:AR学生端教程视频,时间:2min"));
list.add(new Tree("22681", "22672", "1.10.2 研究与挑战:修改时间2022年4月4日温馨提示-钉钉,时间:0.3min"));
list = new ReplacementTree().builTree(list);
String jsonString = JSON.toJSONString(list);
System.out.println(jsonString);
}
}
2、树型结构实体类
package com.lyq.generateTree;
import java.util.ArrayList;
import java.util.List;
/**
* @author : [LiuYanQiang]
* @version : [v1.0]
* @className : ReplacementTree
* @description : [树型结构装换]
* @createTime : [2022/5/2 23:37]
* @updateUser : [LiuYanQiang]
* @updateTime : [2022/5/2 23:37]
* @updateRemark : [描述说明本次修改内容]
*/
public class ReplacementTree {
/*
* @version V1.0
* Title: builTree
* @author LiuYanQiang
* @description 始树形结构创建
* @createTime 2022/5/3 0:18
* @param [list]
* @return java.util.List<com.lyq.generateTree.Tree>*/
public List<Tree> builTree(List<Tree> list) {
List<Tree> treeList = new ArrayList<>();
for (Tree tree : this.getRootNode(list)) {
//建立子树节点
tree = this.buildChilTree(tree,list);
//为根节点设置子树节点
treeList.add(tree);
}
return treeList;
}
/*
* @version V1.0
* Title: buildChilTree
* @author LiuYanQiang
* @description 通过递归来创建子树形结构
* @createTime 2022/5/3 0:18
* @param [tree, list]
* @return com.lyq.generateTree.Tree*/
private Tree buildChilTree(Tree tree,List<Tree> list) {
List<Tree> treeList = new ArrayList<>();
for (Tree t : list) {
//判断当前父节点是否存在子节点
if (t.getP_id().equals(tree.getId())) {
treeList.add(this.buildChilTree(t,list));
}
}
tree.setChildren(treeList);
return tree;
}
/*
* @version V1.0
* Title: getRootNode
* @author LiuYanQiang
* @description 获取全部根节点
* @createTime 2022/5/3 0:18
* @param [list]
* @return java.util.List<com.lyq.generateTree.Tree>*/
private List<Tree> getRootNode(List<Tree> list) {
List<Tree> rootList = new ArrayList<>();
for (Tree tree : list) {
if (tree.getP_id().equals("0")) {
rootList.add(tree);
}
}
return rootList;
}
}
最后返回情况如下
来源:https://blog.csdn.net/weixin_44684272/article/details/124549784


猜你喜欢
- zuul动态路由网关服务是流量的唯一入口。不能随便停服务。所以动态路由就显得尤为必要。数据库动态路由基于事件刷新机制热修改zuul的路由属性
- 现在基于信息安全问题,特别是版本是23以上权限越严格。特别是拍照,读,写权限一般权限允许过,下次就不用询问了的,所以很多应用都喜欢在首页或者
- 解决方案1:禁用缓存,前一次使用的方法,在电脑上各浏览器都没问题,但在ipad、安卓手机上仍有问题解决方案2:禁用浏览器后退键 javasc
- Random类介绍Random类一个用于产生 伪随机 数字的类。这里的伪随机表示有随机性但是可以基于算法模拟出随机规律。Random类的构造
- 本文实例为大家分享了C#基于winform实现音乐播放器的具体代码,供大家参考,具体内容如下首先,右键工具箱的组件,找到选择项,找到Wind
- 1. java.lang.nullpointerexception 这个异常大家肯定都经常遇到,异常的解释是"程序遇上
- 这几天自己研究了关于地手机上面开发安卓地图的问题,发现百度官方示例demo讲解百度持续定位方面还是讲解的有些不清楚,本人研究了几次之后将其弄
- 本文实例为大家分享了java抓取邮箱号码的具体代码,供大家参考,具体内容如下java抓取文件中邮箱号码的具体代码package reg;im
- 这篇文章主要介绍了Spring StopWatch使用实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- 本文研究的主要是Hibernate hql查询的相关内容,具体如下。HQL介绍Hibernate语言查询(Hibernate Query L
- 主要介绍:1.任务队列2.拒绝策略(抛出异常、直接丢弃、阻塞、临时队列)3.init( min )4.active5.maxmin<=
- 本文实例为大家分享了C#实现简单的聊天窗体的具体代码,供大家参考,具体内容如下一、要使用(学习)到的知识点1、textBox控件(1)功能:
- Springboot上传文件时提示405问题描述:上传文件时请求不通,状态码返回405,如下图: 问题分析:405 Method
- 本文实例为大家分享了Retrofit2 RxJava2实现Android App自动更新,具体内容如下功能解析自动更新可以说已经是App的标
- 如果对一个值可以包含多个,那么可以使用枚举,加上Flags。新建一个Flags枚举类型:[Flags] publi
- public void PrintPercentage(int FinishedCount, int TotalCount) {
- 本文实例讲述了Android开发实现popupWindow弹出窗口自定义布局与位置控制方法。分享给大家供大家参考,具体如下:布局文件:主布局
- JNA(Java Native Access):建立在JNI之上的Java开源框架,SUN主导开发,用来调用C、C++代码,尤其是底层库文件
- 本文实例讲述了Android编程实现图片的颜色处理功能。分享给大家供大家参考,具体如下:先看效果图:图片的颜色处理的基本步骤:1.先拿到一张
- 本文实例讲述了Android编程之短信 * 实现方法。分享给大家供大家参考,具体如下:服务器:1、修改frombean:VideoForm中