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

Java 实现下拉框树状结构接口的核心思路

目录

核心思路

1. 定义树节点数据结构 :

2. 获取扁平化数据 :

3. 构建树形结构 :

4. 暴露接口 :

TreeService.java:树形构建服务

解释 :

 总结


下拉框(Dropdown)展示层级结构数据(如部门、分类等)是一种常见的需求。为了提供用户友好的交互体验,通常需要将扁平化的数据转换为树状结构,并通过接口暴露给前端。

核心思路


实现这一功能的关键在于 将扁平化的数据列表转换为具有父子关系的树形结构 。这通常涉及以下几个步骤:

1. 定义树节点数据结构 :

首先,需要一个数据模型来表示树中的每一个节点。这个节点应该包含至少以下信息:
   
   - id :节点的唯一标识符。
   - parentId :父节点的标识符,用于建立层级关系。根节点的 parentId 通常为 null 或特定值(如 0 )。
   - label 或 name :节点显示文本。
   - children :一个列表,用于存储当前节点的子节点。


2. 获取扁平化数据 :

从数据库或其他数据源中获取所有需要展示的数据。这些数据通常是扁平化的列表,每个记录包含 id 和 parentId 。


3. 构建树形结构 :

这是核心逻辑所在。通过遍历扁平化数据,利用 id 和 parentId 之间的关系,将节点组织成树形结构。常用的方法是使用一个 Map 来存储所有节点,以便通过 id 快速查找,然后遍历节点,将其添加到其父节点的 children 列表中。


4. 暴露接口 :

通过 RESTful API 将构建好的树形结构数据暴露给前端。前端可以调用此接口获取数据,并使用相应的 UI 组件(如 Ant Design 的 TreeSelect 或 Element UI 的 ElTree )进行渲染。


TreeService.java:树形构建服务


在 Java 后端, TreeService 类是实现树形结构构建的核心组件。它的主要职责是封装将扁平数据转换为树形数据的逻辑。

以下是TreeService.java 的核心代码片段和解释:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;// ... existing code ...public class TreeService {// ... existing code .../*** 将扁平化的节点列表构建成树形结构。* @param nodes 扁平化的节点列表,每个节点包含id、parentId等信息。* @return 树形结构的根节点列表。*/public List<TreeNode> buildTree(List<TreeNode> nodes) {List<TreeNode> rootNodes = new ArrayList<>();Map<String, TreeNode> nodeMap = new HashMap<>();// 第一次遍历:将所有节点放入Map中,方便通过ID查找for (TreeNode node : nodes) {nodeMap.put(node.getId(), node);}// 第二次遍历:构建父子关系for (TreeNode node : nodes) {String parentId = node.getParentId();// 如果有父节点且父节点存在于Map中,则将当前节点添加到父节点的children列表中if (parentId != null && nodeMap.containsKey(parentId)) {TreeNode parentNode = nodeMap.get(parentId);if (parentNode.getChildren() == null) {parentNode.setChildren(new ArrayList<>());}parentNode.getChildren().add(node);} else {// 没有父节点或者父节点不存在(即为根节点),则添加到根节点列表中rootNodes.add(node);}}return rootNodes;}}
解释 :

1. buildTree(List<TreeNode> nodes) 方法 :这是 TreeService 的核心方法,接收一个扁平化的 TreeNode 列表作为输入。
2. nodeMap :使用 HashMap 来存储所有节点,键为节点的 id ,值为 TreeNode 对象。这样可以在 O(1) 的时间复杂度内通过 id 查找任何节点,极大地提高了构建效率。
3. 两次遍历 :
   - 第一次遍历 :将所有节点放入 nodeMap 中。这一步是为了确保在构建父子关系时,所有节点都已可被快速访问。
   - 第二次遍历 :遍历原始的扁平化节点列表。对于每个节点,检查其 parentId 。如果 parentId 不为空且对应的父节点存在于 nodeMap 中,则将当前节点添加到父节点的 children 列表中。如果 parentId 为空或父节点不存在(这通常意味着它是顶层节点),则将其添加到 rootNodes 列表中。
4. 返回 rootNodes :最终返回的 rootNodes 列表包含了所有顶层节点,每个顶层节点都递归地包含了其所有子节点,从而形成了完整的树形结构。

 总结


通过 TreeService 中的 buildTree 方法,我们可以高效地将从数据库查询到的扁平化数据转换为前端所需的树形结构。这种模式清晰地分离了数据获取、数据转换和接口暴露的职责,使得代码更具可维护性和扩展性。前端只需调用相应的接口,即可获取并渲染出美观且功能完善的树状下拉框。

相关文章:

Java 实现下拉框树状结构接口的核心思路

目录 核心思路 1. 定义树节点数据结构 &#xff1a; 2. 获取扁平化数据 &#xff1a; 3. 构建树形结构 &#xff1a; 4. 暴露接口 &#xff1a; TreeService.java&#xff1a;树形构建服务 解释 &#xff1a; 总结 下拉框&#xff08;Dropdown&#xff09;展示层级结构数…...

数字化时代养老机构运营实训室建设方案:养老机构运营沙盘实训模块设计

在数字化浪潮席卷各行各业的当下&#xff0c;养老机构运营实训室建设方案中的养老机构运营沙盘实训模块设计&#xff0c;已成为培养专业养老运营人才的关键环节&#xff0c;它需紧密贴合时代需求&#xff0c;构建兼具前瞻性与实用性的实训体系。点击获取实训室建设方案 一、养…...

自由开发者计划 004:创建一个苹果手机长截屏小程序

一. 背景 年初&#xff0c;一个漂亮姐姐突然问我&#xff0c;iphone这么多年一直没法长截屏&#xff0c;你们程序员就没个办法把这个硬伤补上吗&#xff1f; 虎躯一震&#xff0c;脑瓜子嗡嗡的&#xff0c;这么多年的iphone资深用户&#xff0c;最初也不是没有想过这个问题&am…...

【Go语言基础】基本语法

文章目录 一、 程序基本结构二. 词法标记&#xff08;Lexical Tokens&#xff09;&#xff08;编译器解析单元&#xff09;三、 标识符规则&#xff08;变量命名规则&#xff09;四、注释与行分隔符五、关键字与预定义标识符六、 代码示例解析 以下是基于文档的Go语言基础语法总…...

工作流引擎-18-开源审批流项目之 plumdo-work 工作流,表单,报表结合的多模块系统

工作流引擎系列 工作流引擎-00-流程引擎概览 工作流引擎-01-Activiti 是领先的轻量级、以 Java 为中心的开源 BPMN 引擎&#xff0c;支持现实世界的流程自动化需求 工作流引擎-02-BPM OA ERP 区别和联系 工作流引擎-03-聊一聊流程引擎 工作流引擎-04-流程引擎 activiti 优…...

【虚拟机版本号】如果忘记了版本号,这样查找版本号

【虚拟机版本号】如果忘记了版本号&#xff0c;这样查找版本号 找到虚拟机的文件&#xff1a; 然后用记事本打开这个&#xff1a;.vmx文件 然后搜索.version...

std::conditional_t一个用法

例子摘自&#xff1a; 《mastering-the-c17-stl-make-full-use-of-the-standard-library-components-in-c17.pdf》 struct list_node {int data;list_node *next; };template<bool Const> struct list_of_ints_iterator {friend class list_of_ints;friend class list…...

Java高效批量读取Redis数据:原理、方案与实战案例

Java高效批量读取Redis数据&#xff1a;原理、方案与实战案例 在电商大促场景中&#xff0c;某平台需要实时展示用户购物车数据&#xff0c;面对每秒10万的请求&#xff0c;传统单次读取Redis的方式导致响应延迟高达500ms。通过批量读取优化&#xff0c;最终将延迟降至20ms以内…...

基于RK3568的多网多串电力能源1U机箱解决方案,支持B码,4G等

基于RK3568的多网多串电力能源1U机箱解决方案&#xff0c;结合B码对时和4G通信能力&#xff0c;可满足电力自动化、能源监控等场景的高可靠性需求。核心特性如下&#xff1a; 一、硬件配置 ‌处理器平台‌ 搭载RK3568四核Cortex-A55处理器&#xff0c;主频1.8GHz-2.0GHz&#…...

面试题:Java多线程并发

继承 Thread 类 Thread 类本质上是实现了 Runnable 接口的一个实例&#xff0c;代表一个线程的实例。启动线程的唯一方法就是通过 Thread 类的 start()实例方法。start()方法是一个 native 方法&#xff0c;它将启动一个新线程&#xff0c;并执行 run()方法。 public class M…...

2006-2020年各省用水总量数据

2006-2020年各省用水总量数据 1、时间&#xff1a;2006-2020年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;行政区划代码、地区名称、年份、用水总量 4、范围&#xff1a;31省 5、指标说明&#xff1a;用水总量是指一个国家或地区在一定时期内&#xff…...

舵机在弹簧刀无人机中的作用是什么?

随着俄乌冲突的越发激烈&#xff0c;美国国防部宣布向乌克兰提供“弹簧刀”600型无人机。对于美国接连不断向乌克兰输送武器的做法&#xff0c;俄罗斯方面已经多次指责美国是在“火上浇油”&#xff0c;从而使俄乌冲突持续下去。 那么&#xff0c;弹簧刀究竟是一款怎样的无人机…...

c++ openssl 使用 DES(数据加密标准)进行加密和解密的基本操作

使用 DES&#xff08;数据加密标准&#xff09;进行加密和解密的基本操作&#xff0c;重点展示了 ECB 和 CBC 模式&#xff0c;并且通过篡改密文的方式来进行攻击。下面是对每个部分的详细解析。 1. 结构体 Slip struct Slip {char from[16] { 0 }; // 交易的发起者&#x…...

Git忽略规则.gitignore不生效解决

我在gitlab中新建了一个项目仓库&#xff0c;先把项目文件目录绑定到仓库&#xff0c;并全部文件都上传到了仓库中。 然后又从别的项目复制了忽略文件配置过来&#xff0c;怎么搞他都不能生效忽略我不要提交仓库的文件。 从网上查到说在本地仓库目录中&#xff0c;打开命…...

Excel高级函数使用FILTER、UNIQUE、INDEX

IFERROR(INDEX(UNIQUE(FILTER(明细表副本!B:B,(明细表副本!I:I>$B$1)*(明细表副本!I:I<$B$2)*(明细表副本!C:C<>$B$3)*(明细表副本!V:V$B$4))),ROW(明细表副本!B2)),"")解读 一、FILTER 过滤 FILTER(过滤列&#xff0c;过滤条件过滤条件&#xff09; 过滤…...

6月5日day45

Tensorboard使用介绍 知识点回顾&#xff1a; tensorboard的发展历史和原理tensorboard的常见操作tensorboard在cifar上的实战&#xff1a;MLP和CNN模型 效果展示如下&#xff0c;很适合拿去组会汇报撑页数&#xff1a; 作业&#xff1a;对resnet18在cifar10上采用微调策略下&a…...

Linux 系统 rsyslog 配置

Linux 系统 rsyslog 配置指南 rsyslog 是 Linux 系统的下一代日志处理系统&#xff0c;功能强大且高效。以下是从基础到高级的全面配置指南&#xff1a; 1. 安装与基础配置 安装 rsyslog # Ubuntu/Debian sudo apt update sudo apt install rsyslog# CentOS/RHEL sudo yum …...

基于rpc框架Dubbo实现的微服务转发实战

目录 rpc微服务模块 导入依赖 配置dubbo 注解 开启Dubbo Dubbo的使用 特殊点 并没有使用 Reference 注入 微服务之间调用 可以选用Http 也可以Dubbo 我们 Dubbo 的实现需要一个注册中心 我作为一个服务的提供者 我需要把我的服务注册到注册中心去 调用方需要注册中心…...

matlab基于GUI实现水果识别

基于GUI实现水果识别系统&#xff0c;限一个图片内存在一种水果 图像处理是一种利用计算机分析图像以达到预期结果的技术。图像处理一般指数字图像处理&#xff0c;而数字图像指由工业相机、摄像机、扫描仪等设备捕捉到的二维数组&#xff0c;数组中的元素称为像素&#xff0c…...

视频爬虫的Python库

1. 请求与网络库 最基础的 HTTP 请求库&#xff0c;用于发送 GET/POST 请求获取网页内容。 示例&#xff1a;获取视频页面 HTML 或 API 响应。 import requests response requests.get(https://example.com/video/123) aiohttp 异步 HTTP 请求库&#xff0c;适合大规模并发下…...

深度学习N2周:构建词典

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 本周任务&#xff1a;使用N1周的.txt文件构建词典&#xff0c;停用词请自定义 1.导入数据 from torchtext.vocab import build_vocab_from_iterator from co…...

Qt多线程访问同一个数据库源码分享(基于Sqlite实现)

Qt多线程访问同一个数据库源码分享&#xff08;基于Sqlite实现&#xff09; 一、实现难点线程安全问题死锁风险连接管理问题数据一致性性能瓶颈跨线程信号槽最佳实践建议 二、源码分享三、测试1、新建一个多线程类2、开启多线程插入数据 一、实现难点 多线程环境下多个线程同时…...

多类别分类中的宏平均和加权平均

前言 在处理多类别分类问题时&#xff0c;宏平均&#xff08;Macro-average&#xff09;和加权平均&#xff08;Weighted-average&#xff09;是评估模型性能时常用的两种聚合指标。它们都能将每个类别的独立指标&#xff08;如精确率、召回率、F1分数等&#xff09;整合成一个…...

电子电路:什么是扩散电容?

PN结的电容效应主要有两种:势垒电容和扩散电容。势垒电容是由于耗尽层宽度变化引起的,而扩散电容可能和载流子的扩散过程有关。扩散电容通常出现在正向偏置的情况下,因为这时候多子注入到对方区域,形成电荷的积累。 当PN结正向偏置时,电子从N区注入到P区,空穴从P区注入到…...

贪心算法应用:装箱问题(FFD问题)详解

贪心算法应用&#xff1a;装箱问题(FFD问题)详解 1. 装箱问题概述 装箱问题(Bin Packing Problem)是计算机科学和运筹学中的一个经典组合优化问题。问题的描述如下&#xff1a; 给定一组物品&#xff0c;每个物品有一定的体积&#xff0c;以及若干容量相同的箱子&#xff0c…...

机器学习的数学基础:假设检验

假设检验 默认以错误率为性能度量&#xff0c;错误率由下式给出&#xff1a; E ( f , D ) ∫ x ∼ D I I ( f ( x ) ≠ y ) p ( x ) d x E(f,\mathcal{D})\int_{\boldsymbol{x}\sim \mathcal{D}}\mathbb{II}(f(\boldsymbol{x})\ne y )p(\boldsymbol{x})\text{d}\boldsymbol{x…...

余氯传感器在智慧水务系统中如何实现IoT集成

现代余氯传感器&#xff08;关键词&#xff1a;智能余氯监测、物联网水质传感器、LoRaWAN水监测&#xff09;通过&#xff08;关键词&#xff1a;Modbus RTU、4-20mA输出、NB-IoT传输&#xff09;协议与SCADA系统对接&#xff0c;实现&#xff08;关键词&#xff1a;远程氯浓度…...

操作系统学习(九)——存储系统

一、存储系统 在操作系统中&#xff0c;存储系统&#xff08;Storage System&#xff09; 是计算机系统的核心组成部分之一&#xff0c;它负责数据的存储、组织、管理和访问。 它不仅包括物理设备&#xff08;如内存、硬盘&#xff09;&#xff0c;还包括操作系统提供的逻辑抽…...

服务器安装软件失败或缺依赖怎么办?

服务器在安装软件时失败或提示缺少依赖&#xff0c;是运维中非常常见的问题。这个问题大多发生在 Linux 云服务器环境&#xff0c;原因和解决方法也有共性。以下是详细说明和解决建议&#xff1a; &#x1f9e0; 一、常见原因分析 问题类型描述&#x1f50c; 软件源不可用服务器…...

linux nm/objdump/readelf/addr2line命令详解

我们在开发过程中通过需要反汇编查看问题&#xff0c;那么我们这里使用rk3568开发板来举例nm/objdump/readelf/addr2line 分析动态库和可执行文件以及.o文件。 1&#xff0c;我们举例nm/objdump/readelf/addr2line解析linux 内核文件vmlinux &#xff08;1&#xff09;,addr2…...