ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

根据ParentId生成树状结构这po事

2021-12-16 13:32:42  阅读:200  来源: 互联网

标签:... UserVO userVO 树状 parentId List private ParentId po


最近项目里老是碰到数据库里存放父子级关系,然后获取出来要根据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问题解决了。没想通之前我是真绕了半天,也想不通为什么数据库要那么设计表。相通了之后一切都变得似乎很合理。不知道你看懂了吗?要是觉得写的不错,记得一键三连加关注哦!如果你有更好的设计思路或解决办法也可以下方留言。我就是个菜狗,还望大佬们带带我!!!

标签:...,UserVO,userVO,树状,parentId,List,private,ParentId,po
来源: https://blog.csdn.net/qq_43291207/article/details/121970048

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有