使用Java将一个List运用递归转成树形结构案例
作者:严老板的博客 发布时间:2021-10-14 15:18:30
标签:Java,List,递归,树形结构
在开发中,我们会遇到将不同组织架构合并成tree这种树状结构,那么如果做呢?
实际上,我们也可以理解为如何将拥有父子关系的list转成树形结构,而这其中主要的方法就是递归!
1、实体对象:
@Data
public class Node {
private Integer id;
private String city;
private Integer pid;
private List<Node> children;
public Node(Integer id,String city,Integer pid){
this.id = id;
this.city = city;
this.pid = pid;
}
}
2、转换工具类:
public class TreeUtils {
//把一个List转成树
static List<Node> buildTree(List<Node> list,Integer pid){
List<Node> tree=new ArrayList<>();
for(Node node:list){
if(Objects.equals(node.getPid(),pid)){
tree.add(findChild(node,list));
}
}
return tree;
}
static Node findChild(Node node, List<Node> list){
for(Node n:list){
if(Objects.equals(n.getPid(),node.getId())){
if(node.getChildren() == null){
node.setChildren(new ArrayList<Node>());
}
node.getChildren().add(findChild(n,list));
}
}
return node;
}
public static void main(String[] args) {
Node node0=new Node(0,"中国",-1);
Node node1=new Node(1,"湖北省",0);
Node node2=new Node(2,"武汉市",1);
Node node3=new Node(3,"洪山区",2);
Node node4=new Node(4,"宜昌市",1);
Node node5=new Node(5,"上海市",0);
Node node6=new Node(6,"静安区",5);
List<Node> list=new ArrayList<>();
list.add(node3);
list.add(node4);
list.add(node1);
list.add(node2);
list.add(node5);
list.add(node6);
list.add(node0);
List<Node> nodes = buildTree(list,-1);
System.out.println(JSON.toJSONString(nodes));
}
}
3、运行结果:
这样list就成功转换成为了tree装结构
来源:https://blog.csdn.net/weixin_36586564/article/details/117918287


猜你喜欢
- Mybatis typeAlias配置1.定义别名<typeAliases> <ty
- 本文实例为大家分享了Unity实现仿3D轮转图效果的具体代码,供大家参考,具体内容如下一、效果演示二、实现思路—&
- 因为项目需要,需要在一个之前没做过springBoot项目的eclipse上跑一个springBoot项目并完成打包,所以就在网上查完资料以
- 一、项目简述功能包括: 前台+后台健身房管理系统,用户预订,教练选择。课程选 择,登录,后台管理等等。二、项目运行环境配置: Jdk1.8
- 本文实例讲述了C#定义简单的反射工厂用法。分享给大家供大家参考。具体分析如下:首先,定义一个水果抽象类,代码如下:class Fruit{
- Bean Validation 中内置的 constraint @Null 被注释的元素必须为 null @NotNull 被注释的元素必须
- Dart实体类格式class CategoryMo { String name; int count;CategoryMo({this.na
- 本文实例讲述了java针对电话号码正则匹配的方法。分享给大家供大家参考。具体如下:public interface RegExpConst
- 1. 前言Compose 具有超强的兼容性,兼容现有的所有代码,Compose 能够与现有 View 体系并存,可实现渐进式替换。这就很有意
- 一、序言在日常一线开发过程中,总有列表转树的需求,几乎是项目的标配,比方说做多级菜单、多级目录、多级分类等,有没有一种通用且跨项目的解决方式
- Java二叉树排序算法排序二叉树的描述也是一个递归的描述, 所以排序二叉树的构造自然也用递归的:排序二叉树的3个特征:1:当前node的所有
- 方法重写与之前的方法重载不同回顾一下方法重载,相同的方法名不同参数类型和参数数量以及参数顺序package Demo1;import jav
- 在Update函数中执行:if (turnAround) { playerCamera.RotateA
- 模块调用之后,记录模块的相关日志,看似简单,其实暗藏玄机。1.简述模块日志的实现方式大致有三种:AOP + 自定义注解实现输出指定格式日志
- 1.注解声明:通过@interface就可以声明一个注解。@Target(ElementType.FIELD)@Retention(Rete
- pom.xml与settings.xmlpom.xml与setting.xml,可以说是Maven中最重要的两个配置文件,决定了Maven的
- 近期很多小伙伴问我,为何启动项目的时候Spring 或 Spring MVC资源文件找不到
- 本文为大家分享了Android使用线程获取网络图片的具体代码,供大家参考,具体内容如下AndroidManifest.xml &n
- 本文实例讲述了C#画图之饼图折线图的实现方法,是C#程序设计中非常实用的技巧。分享给大家供大家参考。具体方法分析如下:显示图像的控件定义如下
- 前言话不多说,直接上图:笔者使用 RecyclerView 的 ItemTouchHelper 来实现这个效果,过程非常简单。为了学习,这里