根据根节点和子节点构造树形结构

企业级AI项目落地实战指南 企业级 AI 项目落地需构建“分阶段实施 + 多维度风控”的双轮驱动体系:实施端通过 POC 验证技术可行性、试点建立评估标准、规模化实现价值复制,各阶段需结合行业案例(如东阳光药、旺盈集团)提炼可复用经验;风险端则需覆盖技术(数据安全、模型稳定性)、合规(全球监管动态)、组织(人才与文化)维度,通过工具化框架(AI TRISM)与案例策略(邮储银行可解释性设计、拓斯达培训体系)实现风险可控。最终通过“场景聚焦 - 合规嵌入 - 持续优化”的循环机制,实现 AI 技术从“试点成功”到“全面价值创造”的跨越。 阅读详情
package com.cyc.basic.test.list;

import com.alibaba.fastjson.JSON;
import lombok.Data;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * @description: 遍历构造树形结构{根节点, 子节点}
 * @version 1.0
 * @author cyc
 * @date 2022/3/11 15:53
 */
public class ParentChildListTest {

    public static void main(String[] args) {
        //模拟从数据库查询出来
        List<Menu> menus = Arrays.asList(
                new Menu(1, "根节点", 0),
                new Menu(2, "父节点1", 1),
                new Menu(3, "子节点1.1", 2),
                new Menu(4, "子节点1.2", 2),
                new Menu(5, "子节点1.3", 2),
                new Menu(6, "父节点2", 1),
                new Menu(7, "子节点2.1", 6),
                new Menu(8, "子节点2.2", 6),
                new Menu(9, "子子节点2.2.1", 7),
                new Menu(10, "子子节点2.2.2", 7),
                new Menu(11, "父节点3", 1),
                new Menu(12, "子节点3.1", 11)
        );

        //获取父节点-方式1
        List<Menu> collect = menus.stream().filter(m -> m.getParentId() == 0).map(
                menu -> {
                    menu.setChildList(getChildrens(menu, menus));
                    return menu;
                }
        ).collect(Collectors.toList());

        //获取父节点-方式2, 使用peek函数, peek 对每个元素执行操作并返回一个新的 Stream
        List<Menu> collect2 = menus.stream().filter(menu -> menu.getParentId() == 0).peek(
                menu -> menu.setChildList(getChildrens(menu, menus))
        ).collect(Collectors.toList());

        System.out.println("-------转json输出结果-------");
        System.out.println(JSON.toJSON(collect));
    }

    /**
     * 递归查询子节点
     * @param root  根节点
     * @param all   所有节点
     * @return 根节点信息
     */
    private static List<Menu> getChildrens(Menu root, List<Menu> all) {
        List<Menu> children = all.stream().filter(menu -> Objects.equals(menu.getParentId(), root.getId()))
                .map(menu -> {
                            // 此时的menu作为父节点, 继续从所有节点中查询其子节点
                            menu.setChildList(getChildrens(menu, all));
                            return menu;
                        }
                ).collect(Collectors.toList());
        return children;
    }
}


@Data
class Menu {
    /**
     * id
     */
    public Integer id;
    /**
     * 名称
     */
    public String name;
    /**
     * 父id ,根节点为0
     */
    public Integer parentId;
    /**
     * 子节点信息
     */
    public List<Menu> childList;


    public Menu(Integer id, String name, Integer parentId) {
        this.id = id;
        this.name = name;
        this.parentId = parentId;
    }

}

输出结果

[{
	"name": "根节点",
	"childList": [{
		"name": "父节点1",
		"childList": [{
			"name": "子节点1.1",
			"childList": [],
			"id": 3,
			"parentId": 2
		}, {
			"name": "子节点1.2",
			"childList": [],
			"id": 4,
			"parentId": 2
		}, {
			"name": "子节点1.3",
			"childList": [],
			"id": 5,
			"parentId": 2
		}],
		"id": 2,
		"parentId": 1
	}, {
		"name": "父节点2",
		"childList": [{
			"name": "子节点2.1",
			"childList": [{
				"name": "子子节点2.2.1",
				"childList": [],
				"id": 9,
				"parentId": 7
			}, {
				"name": "子子节点2.2.2",
				"childList": [],
				"id": 10,
				"parentId": 7
			}],
			"id": 7,
			"parentId": 6
		}, {
			"name": "子节点2.2",
			"childList": [],
			"id": 8,
			"parentId": 6
		}],
		"id": 6,
		"parentId": 1
	}, {
		"name": "父节点3",
		"childList": [{
			"name": "子节点3.1",
			"childList": [],
			"id": 12,
			"parentId": 11
		}],
		"id": 11,
		"parentId": 1
	}],
	"id": 1,
	"parentId": 0
}]
PID参数自整定实战解析:从继电反馈到智能调节的完整实现 本文深入解析PID参数自整定的实战应用,从继电反馈原理到智能调节算法的完整实现。通过详细讲解振荡波形特征提取、参数计算的工程化改进及工业场景调试技巧,帮助工程师快速掌握PID自整定技术,提升控制系统性能。特别针对嵌入式系统优化和噪声环境下的稳定策略提供了实用解决方案。 阅读详情

相关推荐

银河麒麟V10离线升级OpenSSH实战:从编译到回滚全流程

OpenSSH作为Linux系统远程登录的核心组件,其版本升级直接关系到系统安全与等保合规。在信创环境下,银河麒麟V10自带的OpenSSH版本往往无法满足漏洞扫描与安全加固要求,而离线编译升级涉及依赖处理、编译参数、服务替换与回滚方案等多个技术环节。本文围绕银河麒麟V10(x86_64)平台,详细讲解OpenSSH离线升级的完整实操流程,包括环境摸底、依赖包安装、源码编译、配置文件兼容性处理、服务重启验证以及常见问题排查,并分享批量升级与安全加固的工程经验,帮助运维人员在不断网、不重装的前提下一次成功完成

weixin_30582943的博客 383

通过HashMap快速将叶子节点构建成树状结构

现在有一批叶子节点,它们通过id,parentId来表示父子级关系。 但是我们希望它们的关系是成树状图的形式展示的。 例如将下列数据:[{id:1,parentId:null,childrens:null}{id:2,parentId:null,childrens:null},{id:3,parentId:1,childrens:null} ,{id:4,parentId:1,childrens

健秋的博客 3282

Windows 24H2升级后eNSP AR_40报错40?VirtualBox虚拟化修复指南

虚拟化技术通过Hypervisor在操作系统与硬件间建立抽象层,使虚拟机能够共享物理资源。其核心原理依赖CPU的VT-x/AMD-V指令集,而Windows 24H2对内核隔离与驱动签名的强化会直接占用或拦截这些虚拟化资源。在工程实践中,VirtualBox作为Type-2型Hypervisor,常因内存完整性开启或版本过旧导致虚拟网卡创建失败,进而引发设备启动中断。典型场景包括网络仿真实验、多系统测试环境搭建等。当eNSP的AR_40路由器依赖VirtualBox引擎时,24H2的安全策略变更便会触发错误

weixin_34375251的博客 214

如何从树叶层开始建树?

在开发软件的过程中,遇到一个树形结构的问题,如下图:             由于树形结构太大,只显示部分叶节点,并且报价是叶节点的数量和报价的成积。  问题经分析很显然:变成了如下两个问题: 1从树的根节点开始建树就是一个简单的递归,但现在的问题是从树的叶节点开始如何建树,涉及到一个如何合并子节点的问题。 2如何根据叶节点的数量和报价计算各级父节点的报价?

xuexiaodong2009的专栏 5677

OpenIddict实战:5步搞定.NET Core应用的OIDC单点登录集成

本文详细介绍了如何使用OpenIddict在.NET Core应用中快速实现OIDC单点登录集成。通过五个关键步骤,包括环境准备、数据库集成、客户端注册、令牌配置和多应用SSO集成,帮助开发者高效构建安全的企业级单点登录解决方案。

lambda的博客 726

【华为2021校招】笔试题【通用硬件】

时间:2020/07/15 19:00 时长:60min 题型:40单选+5多选 难度:中等 考察范围:模电、数电、SI、EMC、电源、微机原理、计算机网络、材料

Jkcia的博客 4万+

Java后端递归构建树形结构

记录:在Java后台利用递归思路进行构建树形结构数据,返回给前端,能以下拉菜单等形式进行展示。 简明:为了简化代码,引入Lombok的Jar包,可省略实体类set()、get()方法。 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> ...

彼岸尚有荣光在,应不断记录总结!!! 1万+

关于在线excel插件Univer笔记教程

univer在线excel插件确实是够强大,但也存在不少bug,用户用起来是真的很爽,和本地的wps差不多,但真正的开发起来是真的费劲。由于文档提供的信息不足,我们很多功能只能去看他们插件里的源代码,然后一点点测试,一点点尝试研究。此文章可省去五天的研究成本

guiplan 5824

二叉树遍历

对于二叉树的遍历,分为先序遍历(中->左->右)、中序遍历(左->中->右)和后序遍历(左->右->中)。 从实现角度来看,其技术难度在于怎么从子结点的遍历过程中找到原始的父结点。 一般来说,有三种实现方法。 1. 递归遍历: 递归遍历是教科书上常用的方法,实现简单,容易理解。问题在于当树比较深的时候,递归调用可能会把栈写穿,导致crash,这也是递归调用的一个缺点。 递归调用时间和空

winstan_wahaha的博客 411

web渗透--9--识别web应用框架

1、概述 Web框架指纹识别是信息收集过程中的一个重要任务。获悉目标框架的类型必然为测试人员带来极大的优势,如果该框架在之前就被测试过。测试人员不仅可以获得未修补版本中存在的漏洞,还可以了解此框架中特有的错误配置以及已知的文件结构。从而使指纹识别过程显得格外重要。

武天旭的博客 5097

硬件工程师笔记——运算放大电路Multisim电路仿真实验汇总

本文系统介绍了运算放大电路的基础知识及其应用。主要内容包括:1)运算放大器的基本结构、理想特性及分析方法(虚短、虚断、叠加定理);2)比例运算电路(同向、反向、差分)的工作原理与仿真分析;3)求和运算、加减运算电路的实现方法;4)积分、微分、指数和对数运算电路的基本原理;5)过零电压比较器的功能特点。通过理论分析和仿真实验,详细阐述了各类运算放大电路的输入输出特性、相位关系和增益计算,为硬件工程师提供了实用的电路设计参考。

XU157303764的博客 2477

根据id 和 parentId生成多根列表的树状结构工具类

遂用反射改造了该方法(使用构造者模式,使用者仅需一行代码即可将多条数据记录构造为树状结构)如题,在研究 ruoyi 框架时发现 ruoyi 生成树状结构的方法需要硬编码具体的类型。代码如下,main方法为测试方法。

u012026406的博客 1021

YOLOv8 道路病害检测全栈工程|22 类路面裂缝坑洞 VOC&YOLO 数据集、PyQt 精美 GUI、ONNX 量化、全套训练评估曲线落地

城市道路、国省道、高速公路路面长期受车辆碾压、雨水侵蚀,衍生纵向 / 横向裂纹、坑洼、车辙、接缝剥落等二十余种路面病害。传统人工道路巡检存在致命行业痛点:人工徒步 / 乘车目视巡检效率极低,单日有效巡查里程不足 20 公里;毫米级细微线性裂纹肉眼极易漏检,雨水冲刷后微小病害快速扩张为大坑槽,养护成本翻倍;强光暴晒、阴雨积水、路面油污场景人工分辨难度大;海量巡检图片人工分类统计病害台账耗时数天,养护决策缺乏量化数据支撑。传统阈值、边缘检测图像处理仅能识别大面积坑洞,无法区分二十余种细分裂纹类型,泛化能力极差。

getusushu的博客 120

生成树状图数组数据

//顶级ID为1 function make_tree($arr){ $refer = array(); $tree = array(); foreach($arr as $k => $v){ $refer[$v['id']] = & $arr[$k]; //创建主键的数组引用 } foreach($arr as $k => $v){ $pid = $v['pid']; //获取当前分类的父级id .

angle_hearts的博客 225

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java构造树形结构工具类

节点数据构造为树形结构工具类(从数据库查询出来的List集合构造为树形结构,多条树),可自定义对象,可用作为菜单,机构层级等等

weixin_42952711的博客 1006

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

MySQL查找树形结构中某个节点及其子节点

设计表结构存储树形结构数据时,一般使用 parentId 来记录当前节点的父id。查询出全部数据后通过每个节点各自的 parentId 就能够构造出整棵树。但是,有些时候只想找到某个节点下的所有子节点,如果还是要查全表后构造整棵树再去查找目标节点,就显得很繁琐。

2288

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Java构造树形结构数据

3 月,跳不动了?>>> 最近遇到一个需要构造树形结...

Coder顾的博客 1648

java 根据 根节点及所有子成员 构造树tree

&#13;   实体类entity package com.ompa.biz.entity; import java.util.ArrayList; import java.util.List; public class TreeEntity { private String id; private String name; private String father...

qq_42719108的博客 245

java 构造树形结构_Java构造树形结构数据

最近遇到一个需要构造树形结构的需求,就是提供给类似zTree组件的后端接口 ,在网上找到一种实现方式,但是博主的实现方式(https://blog.youkuaiyun.com/aeaiesb/article/details/40783361),实体类都是Node,我们真实需求中实体类的属性不一定都和博主的相同,那么能不能改造一下呢?下面是改造后的结果。所有要实现树形结构的实体类继承NodeHelper类/*...

weixin_35456296的博客 586

递归构造AD组织结构(Organizational Unit)的树形结构

我们知道,在AD中可以创建组织结构(Organizational Unit,以下称OU), 在OU中可以管理AD的组和用户。有时候需要向用户展示组织的树形结构,这里是一个常用的办法,就是使用递归的方式,从AD的根节点开始,递归查找子节点,然后构造一棵OU树。 操作AD,首先需要引用这两个程序集: using System.DirectoryServices; using System.Dire

shrenk的专栏 4802

java递归构建树形结构

只有一个根节点数据结构: 1、准备表结构及对应的表数据 a、表结构: create table TB_TREE ( CID NUMBER not null, CNAME VARCHAR2(50), PID NUMBER //父节点 ) b、表数据: insert into tb_tree (CID, CNAME, PID) values (1, '中国', 0); insert i...

qq_42765276的博客 2万+

凹入表形式打印树形结构_JavaScript 构造树形结构的一种高效算法

引言我们经常会碰到树形数据结构,比如组织层级、省市县或者动植物分类等等数据。下面是一个树形结构的例子:在实际应用中,比较常见的做法是将这些信息存储为下面的结构,特别是当存在1对多的父/子节点关系时:const data = [ { id: 56, parentId: 62 }, { id: 81, parentId: 80 }, { id: 74, parentId: null }, ...

weixin_39631344的博客 180

获取树形结构根节点到叶子节点的全路径

//类目全路径 Stack <TreeNodeVO> pathstack=new Stack(); iteratorNode(meteorTreeQueryService.queryTree(),pathstack); /** * 利用栈递归获取根节点到叶子节点全路径 * @param treeNodeVO * @param pathstack */ private void iterator...

qq_41987056的博客 806

java实现构造无限层级树形结构

起步实现一个树形结构,新建一个Tree类,主要包含节点id,父节点 默认0为根节点parentId节点的名称name,是否存在子节点hasChild 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647...

nostrud ipsum6 632

java树包含根节点_[Java教程]java 根据 根节点及所有子成员 构造树tree

[Java教程]java 根据 根节点及所有子成员 构造树tree0 2016-11-21 16:00:13//entitypackage com.ompa.biz.entity;import java.util.ArrayList;import java.util.List;public class TreeEntity {private String id;private Str...

weixin_39747399的博客 238

项目实战——获取树形结构

我们在开发中时常会遇到需要用到树形结构这种表示层级关系的结构来表示数据,层级关系明确用户能够很直观的理解彼此的关系。例如:本篇博客主要是总结从一张字段具有父子关系的表中查询并将其转换成树形结构通常需要怎么做,具体步骤是什么?以此来解决后序需要类似的问题如何快速实现或者是有思路,将经历转变为自己的经验。通过这次博客总结对于查询树形结构有了更深的熟悉度和常用思路。另外对于获取树形结构的另外一种方式,创建临时表的方式也有了一定的了解。以至于自己下一次遇到类似的问题多了一个思考的维度。

理想主义的花最终会盛开在浪漫主义的土壤里,我的热情永远不会熄灭在现实的平凡之中,我们终将上岸,阳光万里。 1408
上一篇: 详解spring事务失效和回滚失败的场景
下一篇: mysql如何避免幻读
意田天
博客等级 码龄7年 41粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

意田天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值