当前位置: 首页 > article >正文

集合与树形结构

一、注解说明生成树形结构1.1 注解Retention(RetentionPolicy.RUNTIME)Target(ElementType.FIELD)publicinterfaceTreeId{}Retention(RetentionPolicy.RUNTIME)Target(ElementType.FIELD)publicinterfaceTreeParentId{}1.2 树形节点DatapublicclassWisDepartment{privatestaticfinallongserialVersionUID1L;/** * 外部主键id(三方数据id) */TreeIdFieldMapping(sourceName{an_org_id})TableField(EXTERNAL_ID)privateStringexternalId;/** * 外部主键父Id(三方数据父级id) */TreeParentIdFieldMapping(sourceName{parent_id})TableField(EXTERNAL_PARENT_ID)privateStringexternalParentId;/** * 部门名称 */FieldMapping(sourceName{org_name})NotEmpty(message部门名称不能为空)Length(max64,message部门名称长度不能超过64)TableField(NAME)privateStringname;TableField(existfalse)privateListWisDepartmentchildrennewArrayList();}1.3 树形结构构建工具publicclassTreeBuilderT{publicListTbuildTree(ListTnodes)throwsException{if(nodesnull||nodes.isEmpty())returnCollections.emptyList();Class?clazznodes.get(0).getClass();FieldidFieldgetFieldWithAnnotation(clazz,TreeId.class);FieldparentIdFieldgetFieldWithAnnotation(clazz,TreeParentId.class);FieldchildrenFieldgetChildrenField(clazz);idField.setAccessible(true);parentIdField.setAccessible(true);if(childrenField!null)childrenField.setAccessible(true);// 建立id到node的映射MapObject,TidMapnewHashMap();for(Tnode:nodes){ObjectididField.get(node);idMap.put(id,node);}ListTrootsnewArrayList();for(Tnode:nodes){ObjectparentIdparentIdField.get(node);if(!idMap.containsKey(parentId)||parentIdnull||.equals(parentId)){roots.add(node);}else{TparentidMap.get(parentId);if(childrenField!null){ListTchildren(ListT)childrenField.get(parent);if(childrennull){childrennewArrayList();childrenField.set(parent,children);}children.add(node);}}}returnroots;}privateFieldgetFieldWithAnnotation(Class?clazz,Class?extendsjava.lang.annotation.Annotationanno){for(Fieldf:clazz.getDeclaredFields()){if(f.isAnnotationPresent(anno))returnf;}thrownewIllegalArgumentException(No field with annotation anno);}privateFieldgetChildrenField(Class?clazz){for(Fieldf:clazz.getDeclaredFields()){if(children.equals(f.getName()))returnf;}returnnull;}/** * 集合构建树形结构 * 1.数据节点父级id不存在集合中则需要将父级节点设置为根节点 * param nodes * param rootId * return */publicstaticListWisDepartmentbuildTree(ListWisDepartmentnodes,StringrootId){MapString,WisDepartmentidNodeMapnodes.stream().collect(Collectors.toMap(WisDepartment::getExternalId,node-node));ListWisDepartmentrootNodesnewArrayList();for(WisDepartmentnode:nodes){if(rootId.equals(node.getExternalParentId())){// 根节点rootNodes.add(node);}else{// 非根根据parentId 找父节点然后把自己加入父节点的childrenWisDepartmentparentidNodeMap.get(node.getExternalParentId());if(parent!null){parent.getChildren().add(node);}else{node.setExternalParentId(rootId);rootNodes.add(node);}}}returnrootNodes;}publicstaticvoidmain(String[]args)throwsException{ListWisDepartmentdepartmentsJSONArray.parseArray(ss,WisDepartment.class);System.out.println(data1: JSONObject.toJSONString(departments));StringrootId20221206140844614-6ECD-5B3376E42;TreeBuilderWisDepartmentbuildernewTreeBuilder();// ListWisDepartment tree builder.buildTree(departments);ListWisDepartmenttree2builder.buildTree(departments,rootId);////// ListWisDepartment collect departments.stream().filter(m - m.getExternalParentId().equals(rootId)).map(// (m) - {// m.setChildren(getChildrenList(m, departments));// return m;// }// ).collect(Collectors.toList());// System.out.println(JSONObject.toJSONString(collect));System.out.println(data2: JSONObject.toJSONString(departments));}/** * 获取子节点列表 * param tree * param list * return */publicstaticListWisDepartmentgetChildrenList(WisDepartmenttree,ListWisDepartmentlist){ListWisDepartmentchildrenlist.stream().filter(item-item.getExternalParentId().equals(tree.getExternalId())).map((item)-{item.setChildren(getChildrenList(item,list));returnitem;}).collect(Collectors.toList());returnchildren;}publicstaticStringss[\n {\n \an_org_id\: \an001\,\n \externalId\: \an001\,\n \parent_id\: \20221206140844614-6ECD-5B3376E42\,\n \externalParentId\: \20221206140844614-6ECD-5B3376E42\,\n \path\: \父组织路径\,\n \path_name\: \组织全路径名称\,\n \org_level\: \1\,\n \org_name\: \an001bbk\,\n \org_name_abbr\: \组织简称\,\n \org_order\: \1\,\n \an_org_type\: \1\,\n \an_credit_code\: \xfn40\,\n \an_legal_person\: \法定代表人\,\n \sys_org_code\: \创建人所属部门\,\n \org_is_disabled\: \0\,\n \postal_address\: \通讯地址公司/基地\,\n \charge_project_name\: \项目部负责人\\n }, \n\t\t{\n \an_org_id\: \an002\,\n \externalId\: \an002\,\n \parent_id\: \20221206140844614-6ECD-5B3376E42\,\n \externalParentId\: \20221206140844614-6ECD-5B3376E42\,\n \path\: \父组织路径\,\n \path_name\: \组织全路径名称\,\n \org_level\: \1\,\n \org_name\: \an002\,\n \org_name_abbr\: \组织简称\,\n \org_order\: \2\,\n \an_org_type\: \1\,\n \an_credit_code\: \xfn40\,\n \an_legal_person\: \法定代表人\,\n \sys_org_code\: \创建人所属部门\,\n \org_is_disabled\: \0\,\n \postal_address\: \通讯地址公司/基地\,\n \charge_project_name\: \项目部负责人\\n }, \n\t\t{\n \an_org_id\: \an001001\,\n \externalId\: \an001001\,\n \parent_id\: \an002\,\n \externalParentId\: \an002\,\n \path\: \父组织路径\,\n \path_name\: \组织全路径名称\,\n \org_level\: \1\,\n \org_name\: \an001001\,\n \org_name_abbr\: \组织简称\,\n \org_order\: \1\,\n \an_org_type\: \1\,\n \an_credit_code\: \xfn40\,\n \an_legal_person\: \法定代表人/负责人\,\n \sys_org_code\: \创建人所属部门\,\n \org_is_disabled\: \0\,\n \postal_address\: \通讯地址公司/基地\,\n \charge_project_name\: \项目部负责人\\n }\n\t\t, \n\t\t{\n \an_org_id\: \an003\,\n \externalId\: \an003\,\n \parent_id\: \an003\,\n \externalParentId\: \an0039\,\n \path\: \父组织路径\,\n \path_name\: \组织全路径名称\,\n \org_level\: \1\,\n \org_name\: \an003\,\n \org_name_abbr\: \组织简称\,\n \org_order\: \1\,\n \an_org_type\: \1\,\n \an_credit_code\: \xfn40\,\n \an_legal_person\: \法定代表人/负责人\,\n \sys_org_code\: \创建人所属部门\,\n \org_is_disabled\: \0\,\n \postal_address\: \通讯地址公司/基地\,\n \charge_project_name\: \项目部负责人\\n }\n ];}1.4 树形结构从父级到子级遍历/** * 从根节点开始遍历 * param root */publicstaticvoidlevelOrder(WisDepartmentroot){if(rootnull)return;QueueWisDepartmentqueuenewLinkedList();queue.offer(root);while(!queue.isEmpty()){WisDepartmentnodequeue.poll();System.out.println(JSONObject.toJSONString(node));// 访问父节点当前层queue.addAll(node.getChildren());// 子节点加入队尾下一层处理}}

相关文章:

集合与树形结构

一、注解说明生成树形结构 1.1 注解 Retention(RetentionPolicy.RUNTIME) Target(ElementType.FIELD) public interface TreeId { }Retention(RetentionPolicy.RUNTIME) Target(ElementType.FIELD) public interface TreeParentId { }1.2 树形节点 Data public class WisDepart…...

图解目标检测算法之CenterNet

🌞欢迎来到图解深度学习的世界 🌈博客主页:卿云阁 💌欢迎关注🎉点赞👍收藏⭐️留言📝 📆首发时间:🌹2026年3月20日🌹 ✉️希望可以和大家一起完成…...

Qwen3-ASR-1.7B惊艳效果:戏曲唱段(京剧/越剧)台词精准转写

Qwen3-ASR-1.7B惊艳效果:戏曲唱段(京剧/越剧)台词精准转写 你听过AI识别流行歌曲,但你见过AI听懂京剧唱腔吗?传统戏曲的转写,尤其是那些带着独特唱腔、方言和复杂背景音乐的唱段,一直是语音识别…...

智能电脑排班系统V2024|全自动、高自由度、零门槛排班工具

温馨提示:文末有联系方式产品定位:新一代智能电脑排班系统 扩展版智能排班软件(2024最新稳定版)是一款专为中小团队设计的桌面级自动化排班解决方案。 它融合AI逻辑引擎与人性化交互,兼顾智能调度与人工干预自由度&…...

Qwen3-Reranker-4B实战教程:Qwen3-Reranker-4B在智能法务合同审查中的条款关联重排

Qwen3-Reranker-4B实战教程:Qwen3-Reranker-4B在智能法务合同审查中的条款关联重排 1. 引言 你有没有遇到过这样的情况?一份几十页的合同摆在面前,你需要快速找到所有与“违约责任”相关的条款,但它们在文档里散落各处&#xff…...

关于入手微磁学仿真软件Mumax3的若干问题及解决方案(第一部分)

一.背景及下载 1.什么是MuMax3? MuMax3 是一款基于 GPU 加速的开源微磁学模拟软件,由比利时根特大学开发。它利用有限差分法求解 Landau-Lifshitz-Gilbert (LLG) 方程,凭借 CUDA 核心的并行计算能力,其模拟速度比传统基于 CPU 的…...

零基础玩转GLM-OCR:单卡4090一键部署,纯文本/公式/表格全能解析

零基础玩转GLM-OCR:单卡4090一键部署,纯文本/公式/表格全能解析 1. 工具概览:你的全能文档解析助手 想象一下,你手头有一堆扫描的PDF、照片或截图,里面有重要文字、复杂公式和结构化表格。传统OCR工具要么识别不准&a…...

SUNFLOWER MATCH LAB硬件对接:基于STM32F103C8T6最小系统板的图像采集端设计

SUNFLOWER MATCH LAB硬件对接:基于STM32F103C8T6最小系统板的图像采集端设计 最近在做一个植物生长监测的项目,需要部署一批低成本的图像采集终端。核心需求很简单:定时给植物拍照,然后把照片传到云端服务器。听起来不难&#xf…...

同样是硅做的圆片,价差百倍的秘密:半导体与光伏晶圆的本质区别

如果你留意过半导体和光伏行业的产品价格,一定会有这样的疑问:同样是硅材质、尺寸相近的晶圆,高端半导体晶圆一片能卖到几千元,而光伏硅片却只要几十元,身价相差近百倍。明明都是“硅做的圆片”,为何命运如此不同? 其实答案很简单:它们看似同宗同源,实则从一开始就被…...

OpenClaw环境迁移指南:千问3.5-9B配置备份与恢复

OpenClaw环境迁移指南:千问3.5-9B配置备份与恢复 1. 为什么需要环境迁移? 上周我的主力开发机突然硬盘故障,导致OpenClaw的整套配置丢失。重新搭建环境时,光是飞书通道的授权验证就花了2小时,更别提那些精心调试的自…...

GPEN完整操作流程:从HTTP链接访问到结果保存

GPEN完整操作流程:从HTTP链接访问到结果保存 1. 引言:你的数字美容刀 你有没有翻出过一张老照片,里面的人脸模糊得只剩下轮廓?或者,用AI生成了一张很棒的图,偏偏人脸部分崩坏了?又或者&#x…...

# 系列文3:前后端彻底解耦!统一入参解析,前端只发JSON,后端随意

系列文3:前后端彻底解耦!统一入参解析,前端只发JSON,后端随意 非科班野生程序员,深耕政务信息化20年,这套自研Java Web框架支撑过省级新农保、全国跨省医保结算等核心民生系统,18年稳定运行至今…...

Swoole 5.0适配踩坑实录,深度解析协程生命周期变更、内存管理新规与RPC协议不兼容问题

第一章:Swoole 5.0升级适配全景概览Swoole 5.0 是一次面向现代化 PHP 协程生态的重大演进,彻底移除对传统同步阻塞 API 的兼容包袱,全面拥抱协程原生化设计。其核心变化涵盖事件循环重构、协程调度器强化、HTTP/Server 接口标准化&#xff0c…...

VSCode下载与配置Starry Night Art Gallery开发环境

VSCode下载与配置Starry Night Art Gallery开发环境 如果你对“Starry Night Art Gallery”这个项目感兴趣,想动手参与开发或者自己搭建一个类似的数字艺术画廊,那么第一步就是准备好趁手的开发工具。Visual Studio Code(简称VSCode&#xf…...

手把手教你用Phi-4-mini-reasoning搭建智能解题助手:从部署到实战

手把手教你用Phi-4-mini-reasoning搭建智能解题助手:从部署到实战 1. 项目背景与价值 数学解题一直是学习和教学中的关键环节,但传统方式存在效率低下、资源有限等问题。Phi-4-mini-reasoning作为专为推理任务优化的轻量级模型,为解决这些问…...

第六章:异步访问的同步:6.3.1 dma_resv_usage 层级机制详解

1. 概述 dma_resv(DMA reservation object)是 Linux 内核中管理 GPU buffer 同步的核心机制。每个 dma_resv 对象维护一组 dma_fence,用于追踪对该 buffer 的各种操作。 enum dma_resv_usage 定义了 fence 的用途级别,控制"谁…...

C语言调用MiniCPM-V-2_6推理引擎:高性能嵌入式AI接口开发指南

C语言调用MiniCPM-V-2_6推理引擎:高性能嵌入式AI接口开发指南 如果你是一名C语言开发者,或者正在为嵌入式设备寻找一个既强大又高效的视觉语言模型,那么你来对地方了。今天我们要聊的,是如何用最纯粹的C语言,去直接调…...

YOLOv12官版镜像实战:手把手教你验证COCO数据集,小白也能轻松上手

YOLOv12官版镜像实战:手把手教你验证COCO数据集,小白也能轻松上手 1. 环境准备与快速部署 1.1 镜像环境概览 YOLOv12官版镜像已经预装了所有必要的运行环境,开箱即用。主要配置包括: Python 3.11环境PyTorch 2.5深度学习框架C…...

【THM-题目答案】:Privilege Escalation-Linux Privilege Escalation-Privilege Escalation:PATH

1. 你有写权限的文件夹是什么? What is the odd folder you have write access for?/home/murdoch【思路】:find / -writable 2>/dev/null | cut -d "/" -f 2,3 | grep -v proc | sort -u2. 利用$PATH漏洞读取flag6.txt文件的内容。 Explo…...

ACE-Step应用场景解析:如何为视频快速生成背景音乐?

ACE-Step应用场景解析:如何为视频快速生成背景音乐? 1. 引言:视频创作者的背景音乐痛点 在视频创作过程中,背景音乐的选择往往成为最耗时的环节之一。专业音乐授权费用高昂,免费音乐库又难以找到完全匹配的内容&…...

华为OD机试真题 新系统2026-04-01 C++实现【空间占用计算】

目录 题目 思路 Code 题目 员工A的磁盘空间经常被耗尽,他需要找到占用空间最大的目录或文件,然后决定如何清理文件释放空间。给定某一目录,请编写程序帮助他统计该目录内一级子目录和文件的占用空间,并返回目标目录一级子项(文件或子目录)中占用空间最大的项。 规则说明…...

IndexTTS2 V23问题排查:端口冲突、模型下载慢?常见问题一键解决

IndexTTS2 V23问题排查:端口冲突、模型下载慢?常见问题一键解决 1. 快速入门:IndexTTS2 V23简介 IndexTTS2 V23是由开发者"科哥"推出的最新开源文本转语音(TTS)系统,相比前代版本,它在情感控制和语音自然度…...

Qwen3-14B-Int4-AWQ实战:利用VLOOKUP函数思想实现跨数据源信息智能关联

Qwen3-14B-Int4-AWQ实战:利用VLOOKUP函数思想实现跨数据源信息智能关联 1. 引言:当Excel遇到大数据 "小王,帮我把这两个表格的数据匹配一下。"这样的需求在数据分析工作中再常见不过了。在Excel里,我们通常会使用VLOO…...

数据库安全与运维管控(二):从“共享账号”到本地账密泄露分析

在日常的研发联调和生产排障中,开发人员不可避免地需要连接数据库来核对数据或验证逻辑。目前绝大多数企业的做法依然是:DBA 在底层数据库中执行 GRANT 命令,创建一个只读账号(如 dev_readonly),然后将 IP …...

基于影墨·今颜的Java面试题智能生成与解析系统

基于影墨今颜的Java面试题智能生成与解析系统 面试,对于技术人来说,既是展示能力的舞台,也是一场需要精心准备的“考试”。无论是面试官绞尽脑汁设计能考察真实水平的题目,还是求职者海量刷题却不得要领,传统的面试准…...

Janus-Pro-7B集成Dify实战:构建企业级AI应用工作流

Janus-Pro-7B集成Dify实战:构建企业级AI应用工作流 最近和几个做企业服务的朋友聊天,他们都在头疼一件事:公司里各种业务场景都想用上AI,比如自动审核用户上传的图片、根据商品图生成营销文案,但真要动手做&#xff0…...

大模型学习第8天--python基础(数据结构:列表字典元组)

2026.04.08周二第四部分数据结构:列表list 字典dict 元组tuple 已看完 还剩集合set明天看#列表——增 # stu [] #空列表 # stu ["小明", 18, True, "boys"] # teacher [张老师, 赵老师, 徐老师] # school [teacher, stu, 工作人员, 100] …...

nanobot惊艳效果展示:用‘生成一份Python爬虫获取CSDN文章标题’指令执行结果

nanobot惊艳效果展示:用‘生成一份Python爬虫获取CSDN文章标题’指令执行结果 今天,我想和大家分享一个让我眼前一亮的AI助手体验。最近,我在一个预置了nanobot的镜像环境中,尝试了一个非常具体的指令:“生成一份Pyth…...

Kandinsky-5.0-I2V-Lite-5s本地化部署精讲:JDK环境配置与Docker封装

Kandinsky-5.0-I2V-Lite-5s本地化部署精讲:JDK环境配置与Docker封装 1. 开篇:为什么选择本地化部署 如果你正在寻找一个高效的图像转视频解决方案,Kandinsky-5.0-I2V-Lite-5s绝对值得考虑。这个轻量级模型能够在5秒内完成图像到视频的转换&…...

C++ 入门学习经验 02—— 新手最容易遇到的几个问题以及如何解决

大家好啊!这里是阳阳的博客,一个正在努力学习技术的大学生。上一篇和大家聊了刚接触 C 时的环境搭建、学习路径和心态问题,收到了很多同学的共鸣。所以今天这第二篇,我想继续沿着新手学习时的路线,来和大家聊聊刚学 C …...