最近项目里老是碰到数据库里存放父子级关系,然后获取出来要根据ParentId生成树状结构对象的需要。
也不知道最近是脑子不行还是咋滴。这po事想了老半天才想明白怎么去构建该结构。555555最后敲出来后,豁然开朗,都有想哭的冲动了。
废话不多说,开始总结和分享一下我的解题思路。(其实这问题不难,我是菜鸡)

需求

  1. 数据库里有一张结构大致如下的表格:

  2. 我们需要冲数据库中获取出数据,然后解析成大致如下的树状格式:

解题思路

  1. 让我们先像个东西类比一下好吧,老习惯了,万事万物源于生活,从生活中找例子,往往更容易让人明白。
    这个问题其实就相当于:
    有一个家族,告诉你每个人的爸爸是谁,然后让你把他们家族谱做出来。
    不就是这么一回事嘛!!!!!

  2. 那么让我们想想族谱的问题。我们应该怎么去完成这个事情呢?我觉得首先我们可以把所有人的名单都先排成一排。如下图:

  3. 然后去看提供给我们的信息。我们能知道每个人的爸爸是谁。那么爸爸是谁就加谁后面。如下图:

  4. 最后我们会得到下图这样的结果。这个时候我们知道了什么呢?仔细观察我们就发现我们知道了,每个爸爸他有哪几个儿子。从每个人的爸爸是谁转换成了每个人有几个儿子。这一步很关键很关键。我一直没想清楚怎么解决该问题就是卡在这个点上。

  5. 那么为什么要知道每个人的儿子是谁呢?因为下一步我们要这么来。首先我们把最年长的对象1过来先,然后让他把自己儿子叫过来,然后儿子对象2把他的儿子叫过来。最终得到下图。

代码实现

上述废话一堆,但其实只要理解了上面的逻辑。代码就好写啦。

  1. 首先创建一个User类,匹配数据库的数据结构来获取数据。
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User{private Integer id;private String name;private Integer parentId;}
  1. 首先创建一个UserVO类,作为输出的最终数据结构。
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserVO{private Integer id;private String name;private List<UserVO> children;}
  1. 首先通过数据库获取到所有的User
...
List<User> userList = UserMapper.getAllUser();
...
  1. 创建一个HashMap,遍历上一步的集合将User转变成UserVO,并且向HashMap中赋值。key是parentId,value是子类UserVO对象。还有就是创建一个UserVO集合来存放转变好的UserVO。毕竟转变好之后就不用看User了。
...
List<User> userList = UserMapper.getAllUser();
Map<Integer,List<UserVO>> parentIdUserVOMap = new HashMap<>();
List<UserVO> userVOList = new ArrayList<>();
for(User user : userList){UserVO userVO = new UserVO();BeanUtils.copyProperities(user,userVO);userVOList.add(userVO);int parentId = user.getParentId();if(parentIdUserVOMap.containsKey(parentId)){List<UserVO> userVOs = parentIdUserVOMap.get(parentId);userVOs.add(userVO);}else{List<UserVO> userVOs  = new ArrayList<>();userVOs.add(userVO);parentIdUserVOMap.put(parentId,userVOs); }
}
...
  1. 这个时候,就相当于我们知道了所有的爸爸以及他们各自的儿子们。但是儿子们还没跟到爸爸身边。即目前每个UserVO的children属性都是空的。我们需要把子类放进去。怎么做呢?再遍历一遍所有的爸爸,让他们带好自己的儿子。
...
for(UserVO userVO : userVOList){List<UserVO> childs = parentIdUserVOMap.get(userVO.getId());userVO.setChildren(childs);
}
...
  1. 最后一步,我们要获取年纪最大的爸爸,作为树状结构的顶端,即这个人没有爸爸记录在案,parentId==0
...
List<UserVO> result  = parentIdUserVOMap.get(0);
...

总结

好了,这个po问题解决了。没想通之前我是真绕了半天,也想不通为什么数据库要那么设计表。相通了之后一切都变得似乎很合理。不知道你看懂了吗?要是觉得写的不错,记得一键三连加关注哦!如果你有更好的设计思路或解决办法也可以下方留言。我就是个菜狗,还望大佬们带带我!!!

根据ParentId生成树状结构这po事相关推荐

  1. vue递归生成树状结构

    生成前 生成后 console.log打印 全部实现代码片段(附备注 <template><divclass="container"style="fon ...

  2. golang通过递归遍历生成树状结构

    业务场景: 一个机构查询科室信息的时候,希望返回树状结构的嵌套格式; 解决办法: 通过递归和指针,嵌套成对应的结构体; 借鉴了前人的代码,但是最后递归的指针调用自己也是调试了半天才出来,这里献上完整的 ...

  3. Java生成树状结构返回结果

    树状结果集返回以及收集部分信息 对应的表结构和业务需求如下图所示 实现思路:递归业务代码 1.树状结构结果集返回 实现结果 业务代码 分析此处是先查询出根节点,暂定最大的FAQ.然后设置一个实体作为返 ...

  4. Python操作Excel(将父子级表头生成树状结构)

    import reclass Node:'''容器,用来存储前后节点信息'''__slot__=[]def __init__(self,val,next_,pre,name,no):self.val ...

  5. Vue中使用z-tree处理大数量的数据,生成树状结构

    ✍️ 作者简介: 一个每天中午去打篮球和锻炼的前端开发.

  6. php树形结构变成线性结构,php把数据集转换成树状结构,无限极分类生成树状 – CSDN博客...

    直接上代码,在onethink里面使用的转换树状结构/** * 把返回的数据集转换成Tree * @param array $list 要转换的数据集 * @param string $pid par ...

  7. 系统管理模块_部门管理_设计(映射)本模块中的所有实体并总结设计实体的技巧_懒加载异常问题_树状结构...

    系统管理模块_部门管理_设计本模块中的所有实体并总结设计实体的技巧 设计实体流程 1,有几个实体? 一般是一组增删改查对应一个实体. 2,实体之间有什么关系? 一般是页面引用了其他的实体时,就表示与这 ...

  8. 数据库树状结构的关系表的删除方案

    所谓的树状结构的关系,即是记录之间有id,parentId关系的数据.场景是这样的:业务中用到了一张分享表,表里的主要字段有分享人,和被分享人,以及分享任务ID,可以通过一系列的分享构造成树状的结构, ...

  9. mysql如何实现树状结构_实现树状结构的两种方法

    实现树状结构的两种方法 实现树状结构的两种方法 1.递归法 递归是指在函数中显式的调用它自身. 利用递归法实现树状结构的特点是写入数据速度较快,显示速度较慢(在树的分支/层次较多的情况下尤其明显).适 ...

最新文章

  1. linux grep命令总结
  2. 扩增子文献笔记2拟南芥根微生物组的结构和组成
  3. linux c 内核 warning: the frame size of 1040 bytes is larger than 1024 bytes
  4. ITK:跳过特定区域时在图像上迭代
  5. 每日站立会议(第六天)
  6. ssm中怎么用location.href跳到controller层_聊聊自动驾驶中的功能开发
  7. collection转换为list_JAVA 集合 接口继承关系和实现,List,Set,Map(总结)
  8. 入口函数ufusr()的示例 3.2.2
  9. 软件工程之需求说明书
  10. 推荐收藏:50个最佳机器学习公共数据集
  11. 锐起无盘服务器蓝屏死机,锐起无盘蓝屏怎么办?各类无盘蓝屏怎么办?
  12. 英特尔hd630驱动_intel UHD graphics 620/630 -win7 驱动
  13. jpg格式的图片怎么压缩呢?手把手教你快速压缩jpg图片的大小
  14. 论文学习笔记——弱监督语义分割(Learning Integral Objects with Intra-Class Discriminator for Weakly-Supervised Sema)
  15. 低速常温离心机S400
  16. 2023mac电脑系统第三方清理软件CleanMyMacX
  17. NLP领域大语言模型汇总
  18. CAD批量打图精灵功能列表
  19. 匈牙利编码_匈牙利信息图形学的开端
  20. 阿里国际站金品诚企不可忽视的权益

热门文章

  1. python 离群值_数据预处理初学者宝典:360° 掌握离群值识别
  2. 计算机如何删除已连接的打印机驱动程序,hp打印机驱动怎么彻底卸载 hp打印机驱动卸载教程...
  3. LaTeX中的中文处理方法
  4. 分销商城系统开发应用概述详解
  5. 采用morison方程基于matlab计算大直径波浪力,用Morison方程计算分析悬浮隧道所受波浪力初探...
  6. ECS运维神器 之 阿里云云助手
  7. 线性非齐次微分方程的求解套路
  8. 【web前端】js json转数组,数组转json,字符串转数字
  9. 神经网络训练怎么看收敛,神经网络收敛的定义是
  10. latex_箭头上加斜杠