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

news2025/6/6 17:55:47

目录

核心思路

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2401944.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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

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

基于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;弹簧刀究竟是一款怎样的无人机…

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

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

6月5日day45

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

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

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

深度学习N2周:构建词典

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

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

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

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

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

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

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

006网上订餐系统技术解析:打造高效便捷的餐饮服务平台

网上订餐系统技术解析&#xff1a;打造高效便捷的餐饮服务平台 在数字化生活方式普及的当下&#xff0c;网上订餐系统成为连接餐饮商家与消费者的重要桥梁。该系统以菜品分类、订单管理等模块为核心&#xff0c;通过前台展示与后台录入的分工协作&#xff0c;为管理员和会员提…

[10-2]MPU6050简介 江协科技学习笔记(22个知识点)

1 2 3 欧拉角是描述三维空间中刚体或坐标系之间相对旋转的一种方法。它们由三个角度组成&#xff0c;通常表示为&#xff1a; • 偏航角&#xff08;Yaw&#xff09;&#xff1a;绕垂直轴&#xff08;通常是z轴&#xff09;的旋转&#xff0c;表示偏航方向的变化。 • 俯仰角&a…

Spring Boot 3.X 下Redis缓存的尝试(二):自动注解实现自动化缓存操作

前言 上文我们做了在Spring Boot下对Redis的基本操作&#xff0c;如果频繁对Redis进行操作而写对应的方法显示使用注释更会更高效&#xff1b; 比如&#xff1a; 依之前操作对一个业务进行定入缓存需要把数据拉取到后再定入&#xff1b; 而今天我们可以通过注释的方式不需要额外…

【03】完整开发腾讯云播放器SDK的UniApp官方UTS插件——优雅草上架插件市场-卓伊凡

【03】完整开发腾讯云播放器SDK的UniApp官方UTS插件——优雅草上架插件市场-卓伊凡 一、项目背景与转型原因 1.1 原定计划的变更 本系列教程最初规划是开发即构美颜SDK的UTS插件&#xff0c;但由于甲方公司内部战略调整&#xff0c;原项目被迫中止。考虑到&#xff1a; 技术…

C:\Users\中文名修改为英文名

C:\Users\中文名修改为英文名 背景操作步骤 背景 买了台新电脑&#xff0c;初始化好不知道啥操作把自己的登录用户名改成了中文&#xff0c;有些安装的软件看见有中文直接就水土不服了。 操作步骤 以下称中文用户名为张三。 正常登录张三用户 进入用户管理页面修改用户名&a…