java如何用递归生成树形结构

 更新时间:2025年03月04日 08:54:12   作者:L丶小先生  
作者分享了自己在使用脚本之家资源进行编程时的经验,包括准备实体对象、测试数据、构造树形结构递归函数、测试以及输出结果等步骤,作者希望这些经验能对大家有所帮助,并鼓励大家支持脚本之家

java用递归生成树形结构

1、准备实体对象

public class TreeNode{
	private int id;
	private int pid;
	private String name;
	private String content;
	private List<TreeNode> children;

	public TreeNode() {
	}

	public TreeNode(int id, int pid, String name, String content) {
		this.id = id;
		this.pid = pid;
		this.name = name;
		this.content = content;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public int getPid() {
		return pid;
	}

	public void setPid(int pid) {
		this.pid = pid;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}

	public List<TreeNode> getChildren(){
		return children;
	}

	public void setChildren(List<TreeNode> children){
		this.children = children;
	}

	@Override
	public String toString() {
		return "TreeNode{" +
				"id=" + id +
				", pid=" + pid +
				", name='" + name + '\'' +
				", content='" + content + '\'' +
				'}';
	}
}

2、准备测试数据

//生成测试数据方法
public static List<TreeNode> generateList(){
	List<TreeNode> list = new ArrayList<>();
	TreeNode treeModel1 = new TreeNode(1,0,"系统管理",getRandomStr());
	TreeNode treeModel2 = new TreeNode(11,1,"用户管理",getRandomStr());
	TreeNode treeModel3 = new TreeNode(111,11,"用户添加",getRandomStr());
	TreeNode treeModel4 = new TreeNode(2,0,"权限管理",getRandomStr());
	TreeNode treeModel5 = new TreeNode(21,2,"账号管理",getRandomStr());
	TreeNode treeModel6 = new TreeNode(221,2,"角色管理",getRandomStr());
	list.add(treeModel1);
	list.add(treeModel2);
	list.add(treeModel3);
	list.add(treeModel4);
	list.add(treeModel5);
	list.add(treeModel6);
	return list;
}

//随便写了一个由26个小写字母随机生成字符串方法
public static String getRandomStr(){
	StringBuilder ret= new StringBuilder();
	for (int i = 0; i < 6; i++) {
		int num=(int)(Math.random()*26+97);
		ret.append((char) num);
	}
	return ret.toString();
}

3、构造树形结构递归函数

/**
 * 生成树
 * @param list 待处理的数据集合
 * @param pid 最顶层的父级id
 */
public static List<TreeNode> createTree(List<TreeNode> list,int pid){
	//根据父id过滤出所有父节点
	List<TreeNode> tree = list.stream().filter(e-> pid == e.getPid()).collect(Collectors.toList());
	//遍历所有父节点,把属于该节点的所有子节点加到该节点的children属性下
	for (TreeNode node: tree) {
		int id = node.getId();
		//过滤出所有属于该节点的子节点
		List<TreeNode> cList = list.stream().filter(e-> id == e.getPid()).collect(Collectors.toList());
		//判断是否存在子节点,若子节点有数据则把该子节点的id作为pid继续递归往下层处理
		if(!SysUtil.isNull(cList)){
			createTree(list,id);
			node.setChildren(cList);
		}
	}
	return tree;
}

4、测试

public static void main(String[] args) throws Exception {

	List<TreeNode> list = generateList();
	list.forEach(System.out::println);
	List<TreeNode> tree = createTree(list,0);
	System.out.println(JSON.toJSONString(tree));


}

5、输出结果

TreeNode{id=1, pid=0, name='系统管理', content='vyzjpq'}
TreeNode{id=11, pid=1, name='用户管理', content='qwbiex'}
TreeNode{id=111, pid=11, name='用户添加', content='zuyuth'}
TreeNode{id=2, pid=0, name='权限管理', content='ctgevw'}
TreeNode{id=21, pid=2, name='账号管理', content='ulgvdx'}
TreeNode{id=221, pid=2, name='角色管理', content='fzxufe'}
[{"children":[{"children":[{"content":"zuyuth","id":111,"name":"用户添加","pid":11}],"content":"qwbiex","id":11,"name":"用户管理","pid":1}],"content":"vyzjpq","id":1,"name":"系统管理","pid":0},{"children":[{"content":"ulgvdx","id":21,"name":"账号管理","pid":2},{"content":"fzxufe","id":221,"name":"角色管理","pid":2}],"content":"ctgevw","id":2,"name":"权限管理","pid":0}]

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • mybatis where 标签使用

    mybatis where 标签使用

    where标记的作用类似于动态sql中的set标记,本文主要介绍了mybatis where 标签使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Spring Integration概述与怎么使用详解

    Spring Integration概述与怎么使用详解

    公司项目需要用到spring integration,而网上关于spring integration的有价值的参考资料比较少,下面这篇文章主要给大家介绍了关于Spring Integration概述与怎么使用的相关资料,需要的朋友可以参考下
    2023-02-02
  • Java设计模式之代理模式详解

    Java设计模式之代理模式详解

    这篇文章主要介绍了Java设计模式之代理模式详解,文中有非常详细的代码示例,对正在学习java的小伙伴们有很好的帮助,需要的朋友可以参考下
    2021-05-05
  • 详解RabbitMQ中延迟队列结合业务场景的使用

    详解RabbitMQ中延迟队列结合业务场景的使用

    这篇文章主要介绍了详解RabbitMQ中延迟队列结合业务场景的使用,延迟队列中的元素都是带有时间属性的,延迟队列就是用来存放需要在指定时间被处理的元素的队列,需要的朋友可以参考下
    2023-05-05
  • Spring Boot Starter中Bean 注册与属性绑定的两大机制最佳实践方案

    Spring Boot Starter中Bean 注册与属性绑定的两大机制最佳实践方案

    在 Spring Boot的世界里,Starter(启动器)是简化依赖管理和自动化配置的强大工具,本文将深入探讨 Spring Boot Starter 中 Bean 初始化的核心机制,并指出最佳实践,感兴趣的朋友跟随小编一起看看吧
    2025-10-10
  • Java中equals和==的区别小结

    Java中equals和==的区别小结

    == 和 equals() 都用于比较两个对象,本文主要介绍了Java中equals和==的区别小结,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2025-06-06
  • Java中的NoClassDefFoundError报错含义解析

    Java中的NoClassDefFoundError报错含义解析

    这篇文章主要为大家介绍了Java中的NoClassDefFoundError含义详解,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2023-11-11
  • JavaWeb中web.xml初始化加载顺序详解

    JavaWeb中web.xml初始化加载顺序详解

    本篇文章主要介绍了JavaWeb中web.xml初始化加载顺序详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • SpringBoot使用Validation包进行输入参数校验

    SpringBoot使用Validation包进行输入参数校验

    Spring Boot 自带的 spring-boot-starter-validation 包支持以标准注解的方式进行输入参数校验,本文即关注 spring-boot-starter-validation 包所涵盖的标准注解的使用、校验异常的捕获与展示、分组校验功能的使用,以及自定义校验器的使用,需要的朋友可以参考下
    2024-05-05
  • Java中关于OAuth2.0的原理分析

    Java中关于OAuth2.0的原理分析

    这篇文章主要介绍了Java中关于OAuth2.0的原理分析,OAuth是一个关于授权的开放网络标准,允许用户授权第三 方应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容,需要的朋友可以参考下
    2023-09-09

最新评论