基于List封装递归树及查找当前节点下所有子节点

这篇具有很好参考价值的文章主要介绍了基于List封装递归树及查找当前节点下所有子节点。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

在Java日常开发中,经常遇到需要组装数据格式为多层级递归树的形式给前端使用,根据具体的业务场景和数据结构封装树的工具类也是各种各样,那么有没有一种通用、简洁、容易理解且高效的方式实现这样的业务场景呢?


一、List常用业务场景的两种数据类型?

一般根据业务场景常用的数据结构类型有List<Entity>和List<Map>这两种数据类型,那么接下来针对这两种类型分别封装树结构

二、封装Tree

1.针对List类型为实体类封装树

实体类代码如下(示例):

import lombok.Data;
import java.util.List;

@Data
public class Entity {
	private String gid; -- 主键
	private String name; -- 名称
	private String parentId; -- 所属父级
	private List<Entity> children; -- 子集合
}

封装Tree代码如下(示例):

import java.util.*;
import org.springframework.util.CollectionUtils;

public class TreeUtil {

	/**
	* 构建树
	* @param parent: 父级目录 入口初始化传 null
	* @param all : 要封装的所有数据集合,包含上下级关系
	*/
	public static List<Entity> buildTree(Entity parent, List<Entity> all) {
		
		if(CollectionUtils.isEmpty(all)) {
			return Collections.emptyList();
		}
		
		if(Objects.isNull(parent)) {
			return all.stream().filter(e -> "0".equals(e.getParentId())).filter(a -> {
				a.setChildren(buildTree(a,all));
				return true;
			}).collect(Collectors.toList());
		}else {
			return all.stream().filter(e -> parent.getGid().equals(e.getParentId())).filter(a -> {
				a.setChildren(buildTree(a,all));
				return true;
			}).collect(Collectors.toList());
		}
	}
}

2.针对List类型为Map封装树

封装Tree代码如下(示例):

import java.util.*;
import org.springframework.util.CollectionUtils;

public class TreeUtil {
	
	/**
	* 构建树
	* @param root : 父级目录 入口初始化传 null
	* @param all : 要封装的所有数据集合,包含上下级关系
	*/
	public static List<Map> buildTree(Map root, List<Map> all) {
		
		if(CollectionUtils.isEmpty(all)) {
			return Collections.emptyList();
		}
		
		if(Objects.isNull(root)) {
			return all.stream().filter(e -> "0".equals(e.get("parent_id")))
					.map(a -> {
						a.put("children", buildTree(a,all));
						return a;
					}
			).collect(Collectors.toList());
		}else {
			return all.stream().filter(e -> root.get("gid").equals(e.get("parent_id")))
					.map(a -> {
						a.put("children", buildTree(a,all));
						return a;
					}
			).collect(Collectors.toList());
		}
	}
}

3.查找当前节点下所有子节点

import java.util.*;
import org.springframework.util.CollectionUtils;

public class TreeUtil {

	/**
	* 查找当前节点下所有子节点
	* @param nodeId : 当前节点
	* @param all : 所有节点数据查找目标集合
	* @param result : 查找的当前节点及节点所有子节点集合
	*/
	public static void findNodeChild(String nodeId, List<Map> all, List<String> result) {
		// 1、查找当前节点下的所有子节点
		List<Map> child = all.stream().filter(a -> nodeId.equals(a.get("parent_id"))).collect(Collectors.toList());
		// 2、添加当前节点
		result.add(nodeId);
		// 3、递归查找
		if(!CollectionUtils.isEmpty(child)) {
			child.stream().forEach(g -> {
				findNodeChild(g.get("gid").toString(),all,result);
			});
		}
	}
}

总结

调用方式:以上封装默认顶级父节点的parent_id赋值为"0"

// 1、调用树
List<Entity> all = jdbc; // 从数据库获取的需要封装的业务数据包含上下级关系那种
List<Entity> result = TreeUtil.buildTree(null,all); // 返回前端的树结构数据
// 2、查找当前节点及其下所有子节点
List<String> result = Lists.newArrayList(); // 当前节点及其下所有子节点gid集合
String nodeId = gid; // 前端传参当前节点gid
TreeUtil.findNodeChild(nodeId,all,result);

记录到此结束,有问题欢迎评论留言讨论,学习路上有你有我~~文章来源地址https://www.toymoban.com/news/detail-645220.html

到了这里,关于基于List封装递归树及查找当前节点下所有子节点的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 次优二叉查找树(次优查找树)_递归和非递归实现_20230414

    前言 当有序表中的各记录的查找概率相等的时候,采用折半查找效率可以提升查找性能;如果有序表中的各记录的查找概率不相等,那么折半查找就不再适用。 如果只考虑查找成功的情况,则使查找性能达到最佳性能的判定树就是带权路径长度的之和,也即路径各个记录的查

    2023年04月16日
    浏览(39)
  • Java方法递归的形式和常见递归算法-方法递归结合File类查找文件

    方法递归的形式 什么是方法递归 ? 方法直接调用自己或者间接调用自己的形式称为方法递归( recursion)。 递归做为一种算法在程序设计语言中广泛应用。 递归的形式 : 直接递归:方法自己调用自己。 间接递归:方法调用其他方法,其他方法又回调方法自己。 递归存在的问

    2024年01月17日
    浏览(42)
  • java 树状数据,递归 从子节点找父节点

    前言:递归算法在项目中也会使用到,简单介绍一下在项目中使用到的场景 补充一个题目 递归方法实现三个要素: 1、明确递归终止条件; 2、给出递归终止时的处理办法; 3、提取重复的逻辑,缩小问题的规模。 场景一:根据树状图的某一节点,查找特定条件的上级节点,子节

    2024年02月11日
    浏览(42)
  • MySQL递归查询所有子集

    在 MySQL 数据库中,WITH RECURSIVE 是递归查询的一种语法。然而,MySQL 并不支持 WITH RECURSIVE 语法。相反,MySQL 提供了另一种递归查询的方法,即使用 CONNECT BY 和 START WITH 语法。 如果您需要执行递归查询, 建议您使用 MySQL 版本 8.0 或更高版本 ,并使用 CONNECT BY 和 START WITH 语法。

    2024年02月10日
    浏览(36)
  • vue封装-获取当前时间

    在开发时,经常遇到转换时间戳的问题,这里封装了一个方法,方便使用。

    2024年02月13日
    浏览(72)
  • Unity项目中查找所有使用某一张图片的材质球,再查找所有使用材质球的预设

    废话少说,直接上代码。 上述代码中,我们首先使用 AssetDatabase.FindAssets 方法通过过滤类型(\\\"t:Material\\\")获取所有材质球的GUID。然后遍历每个GUID,加载对应的材质球,判断该材质球是否引用了指定的图片。我们定义了一个辅助方法 HasTexture 来检查材质球中的纹理是否引用了

    2024年02月14日
    浏览(33)
  • 使用Smartctl脚本输入当前所有磁盘的状态

    一、安装Smartctl         yum install smartmontools 二、写一个脚本输出当前所有磁盘的状态并且按名称分别写入到文件中 以下是这个脚本的详细说明: 第一行是脚本的shebang语句,指定了脚本的解释器。 第二行使用lsblk命令列出所有磁盘。 第三行使用for循环遍历这些磁盘。 在每

    2024年02月08日
    浏览(36)
  • C++ 获取dll当前路径下所有文件

    在.cpp文件头引用头文件和作用域 获取dll文件所在目录地址和获取文件信息 功能代码:获取指定路径下所有文件地址信息 **************************************************************************************************************

    2024年02月10日
    浏览(46)
  • 二叉排序树的定义及基本操作(构造、查找、插入、删除)递归及非递归算法

    二叉排序树(Binary Sort Tree, BST),也称二叉查找树。 二叉排序树或者是一棵空树,或者是一棵具有下列特性的非空二叉树: 1) 若左子树非空,则左子树上所有结点均小于根结点的值; 2) 若右子树非空,则右子树上所有结点均大于根结点的值;

    2024年02月08日
    浏览(61)
  • MySQL一条语句递归查询所有子集数据

    MySQL中,现有一组数据,数据包含字段主键:id,父类ID:pid,id与pid是继承关系,根据某个id查询其下级关联的所有记录; 1、利用递归查询语法。递归查询是在 MySQL 8.0 版本引入的新特性,如果您的 MySQL 版本低于 8.0,则无法使用递归查询语法。 在上面的语句中,使用了 Com

    2024年02月11日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包