springboot树形结构 支持模糊查询,返回匹配节点和父节点,其他节点不返回
package com.me.meterdemo.ds;
import java.util.ArrayList;
import java.util.List;public class TreeNode {private Long id;private String name;private Long parentId;private List<TreeNode> children = new ArrayList<>();// 构造方法public TreeNode(Long id, String name, Long parentId) {this.id = id;this.name = name;this.parentId = parentId;}// Getters and Setterspublic Long getId() { return id; }public String getName() { return name; }public Long getParentId() { return parentId; }public List<TreeNode> getChildren() { return children; }public void addChild(TreeNode child) {// 防止重复添加if (children.stream().noneMatch(c -> c.id.equals(child.id))) {children.add(child);}}
}
package com.me.meterdemo.ds;import org.springframework.stereotype.Service;import javax.annotation.PostConstruct;
import java.util.*;
import java.util.stream.Collectors;@Service
public class TreeMemoryService {// 内存数据存储private final Map<Long, TreeNode> nodeMap = new HashMap<>();// 初始化测试数据@PostConstructprivate void initData() {clearAndInitData();}private void clearAndInitData() {nodeMap.clear();addNode(1L, "集团总部", null);addNode(2L, "华东公司", 1L);addNode(3L, "技术部", 2L);addNode(4L, "开发组", 3L);addNode(5L, "测试组", 3L);addNode(6L, "华南公司", 1L);}private void addNode(Long id, String name, Long parentId) {TreeNode node = new TreeNode(id, name, parentId);nodeMap.put(id, node);}/*** 执行树结构搜索* @param keyword 查询关键词(可为空)* @return 符合条件节点及其父节点组成的树结构*/public List<TreeNode> search(String keyword) {// 空关键词返回空结果if (keyword != null && keyword.trim().isEmpty()) {return Collections.emptyList();}// 获取所有匹配节点List<TreeNode> matches = nodeMap.values().stream().filter(node -> matchesKeyword(node, keyword)).collect(Collectors.toList());// 收集需要展示的节点ID(匹配节点+父链)Set<Long> visibleIds = new LinkedHashSet<>();matches.forEach(node -> collectParentChain(node, visibleIds));// 构建精简树结构return buildPrunedTree(visibleIds);}// 判断节点是否匹配关键词private boolean matchesKeyword(TreeNode node, String keyword) {return keyword == null ||node.getName().contains(keyword);}// 收集节点及其所有父节点private void collectParentChain(TreeNode node, Set<Long> ids) {Long currentId = node.getId();while (currentId != null) {if (!ids.add(currentId)) break; // 防止循环TreeNode current = nodeMap.get(currentId);currentId = current.getParentId();}}// 构建修剪后的树结构private List<TreeNode> buildPrunedTree(Set<Long> visibleIds) {// 创建节点副本防止污染原始数据Map<Long, TreeNode> visibleNodes = createNodeCopies(visibleIds);// 构建层级关系List<TreeNode> roots = new ArrayList<>();visibleNodes.values().forEach(node -> {Long parentId = node.getParentId();if (parentId == null) {roots.add(node);} else {TreeNode parent = visibleNodes.get(parentId);if (parent != null) {parent.addChild(node);}}});return roots;}// 创建节点副本(清空原有子节点)private Map<Long, TreeNode> createNodeCopies(Set<Long> visibleIds) {return visibleIds.stream().map(id -> nodeMap.get(id)).filter(Objects::nonNull).collect(Collectors.toMap(TreeNode::getId,orig -> new TreeNode(orig.getId(),orig.getName(),orig.getParentId())));}// 重置测试数据(可选)public void resetData() {clearAndInitData();}
}
package com.me.meterdemo.ds;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
public class TreeDSController {private final TreeMemoryService treeMemoryService;public TreeDSController(TreeMemoryService treeService) {this.treeMemoryService = treeService;}@GetMapping("/search")public List<TreeNode> searchTree(@RequestParam(required = false) String keyword) {return treeMemoryService.search(keyword);}
}
springboot树形结构 支持模糊查询,返回匹配节点和父节点,其他节点不返回
相关文章:
springboot树形结构 支持模糊查询,返回匹配节点和父节点,其他节点不返回
package com.me.meterdemo.ds; import java.util.ArrayList; import java.util.List;public class TreeNode {private Long id;private String name;private Long parentId;private List<TreeNode> children new ArrayList<>();// 构造方法public TreeNode(Long i…...
pythonSTL---sys
sys 是 Python 标准库中的一个内置模块,它提供了许多与 Python 解释器和系统环境进行交互的功能。 sys方法 1. 导入 sys 模块 在使用 sys 库的功能之前,需要先导入它: import sys2. 命令行参数 (sys.argv) sys.argv 是一个包含命令行参数…...
基于Python+Flask+MySQL+HTML的爬取豆瓣电影top-250数据并进行可视化的数据可视化平台
FlaskMySQLHTML 项目采用前后端分离技术,包含完整的前端,以flask作为后端 Pyecharts、jieba进行前端图表展示 通过MySQL收集格列数据 通过Pyecharts制作数据图表 这是博主b站发布的详细讲解,感兴趣的可以去观看:【Python爬虫可…...
Python在数据处理中的应用:从入门到精通
活动发起人小虚竹 想对你说: 这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧!…...
七大常用智能家居协议对比
如果您不知道在项目中使用哪种智能家居通信协议,那么进入智能家居行业可能会很困难。如果没有合适的协议将其集成到智能家居生态系统中,智能家居设备将无法正常工作。否则,您将面临硬件和软件无法满足最终用户期望的风险。协议选择不当可能会…...
996引擎-问题处理:缺失特效分割文件 ModelAtlasSplitConfigs
通常我们买的资源都是带会 ModelAtlasSplitConfigs.txt 或 sceneAtlasSplitConfigs.txt 的 但有时确实找不到的话,是可以用996工具生成的:...
异步加载错误如何解决
首先是 提供两张图 如果数据过多的情况下我在所内和住家形式频繁的来回切换 导致数据展示的不一样 大家是不是有这样的问题 这个是导致了数据展示有问题的情况 住家的情况本来是没有几层的 下面我帮大家解决一下 // 防止异步延迟 const Noop () > { } const lhl (resDa…...
R语言零基础系列教程-01-R语言初识与学习路线
代码、讲义、软件回复【R语言01】获取。 R语言初识 R是一个开放的统计编程环境,是一门用于统计计算和作图的语言。“一切皆是对象”,数据、函数、运算符、环境等等都是对象。易学,代码像伪代码一样简洁,可读性高强大的统计和可视…...
C 语言实现彩票模拟:指针与数组的巧妙运用
在 C 语言编程学习中,通过实践项目来掌握知识是非常有效的途径。本次我们聚焦于一个彩票模拟程序的实现,这不仅能让大家巩固 C 语言的基础概念,还能深入理解指针和数组在实际场景中的运用。 一、彩票模拟程序需求分析 彩票模拟程序主要模拟真实彩票抽奖的过程。具体来说,需…...
自动化测试-网页聊天室
项目介绍: 针对基于WebSocket协议的网页端即时通讯系统,主导设计并实施全流程自动化测试方案。通过构建模块化测试框架,完成对核心业务场景(用户登录鉴权、消息同步、实时聊天等)的自动化验证,最终达成测试…...
WPF CommunityToolkit.MVVM库的简单使用
CommunityToolkit.MVVM 是 .NET 社区工具包中的一部分,它为实现 MVVM(Model-View-ViewModel)模式提供了一系列实用的特性和工具,能帮助开发者更高效地构建 WPF、UWP、MAUI 等应用程序。以下是关于它的详细使用介绍: 1…...
ffmpeg面试题整理
1. 基础概念 问题:FFmpeg 是什么?它的核心功能有哪些? 编解码:支持几乎所有音视频格式(如 H.264, AAC, MP3)。转换:在不同容器格式之间转换(如 MP4 → MKV)。流处理&…...
创新实践分享:基于边缘智能+扣子的智能取物机器人解决方案
在 2024 年全国大学生物联网设计竞赛中,火山引擎作为支持企业,不仅参与了赛道的命题设计,还为参赛队伍提供了相关的硬件和软件支持。以边缘智能和扣子的联合应用为核心,参赛者们在这场竞赛中展现出了卓越的创新性和实用性…...
【蓝桥杯】省赛:神奇闹钟
思路 python做这题很简单,灵活用datetime库即可 code import os import sys# 请在此输入您的代码 import datetimestart datetime.datetime(1970,1,1,0,0,0) for _ in range(int(input())):ls input().split()end datetime.datetime.strptime(ls[0]ls[1],&quo…...
虚幻基础:蓝图常用节点
文章目录 timelinedelay/retriggerable:计时器:计时后的代码只执行一次delay:计时期间不可再触发,走完后再触发。retriggerable:计时期间可重复触发,触发则刷新计时时间。 doOnce:只可触发一次&…...
使用kubeadm方式以及使用第三方工具sealos搭建K8S集群
目录 kubeadm方式: 一、安装要求 二、环境准备 二、安装Docker、kubeadm、kubelet 1、安装Docker (1)首先配置一下Docker的阿里yum源 (2)然后用yum 方式安装docker (3)配置Docker镜像加速器 &#…...
ELK traceId实现跨服务日志追踪
ELK怎么实现跨服务日志追踪,Trace-Id 具体实现方案及代码_kibana关联其他服务器的日志-CSDN博客 ELKMDC追踪日志 ---- SpringCloud实现传递_elk的mdc-CSDN博客 SpringBoot之HandlerInterceptor拦截器的使用 ——(一)-CSDN博客 在使用ELK&a…...
2025 linux系统资源使用率统计docker容器使用率统计docker监控软件Weave Scope安装weavescope
1.Weave Scope介绍 Weave Scope 是一款用于监控和可视化 Docker 容器、Kubernetes 集群以及分布式应用的强大工具。它的设计目标是帮助开发者和运维人员更好地理解和管理复杂的微服务架构。以下是 Weave Scope 的主要优点: 1. 实时可视化 Weave Scope 提供了一个直…...
通过特征值和特征向量实现的图像压缩和特征提取
前文,我们在学习人工智能的线性代数基础的时候,就了解到,矩阵在人工智能中被广泛使用,接下来我们就从大家非常常见的图像开始,深度理解矩阵在人工智能中的应用。有关线性代数基础的文章可以看的我CSDN:人工智能中的线性…...
html-to-image的使用及图片变形和无图问题修复
html-to-image的使用及图片变形和无图问题修复 最近迭代的时候因为新增了一个需求,需要前端提供素材及样式给后端,后端同步渲染,但是因为部分样式问题后端无法实现所以决定前端将页面生成图片然后传递给后端使用,本文记录一下使用…...
【eNSP基础使用教程-1】
座右铭: 纵有疾风起,人生不言弃。 文章目录 前言一、更改设备名称指令1、双击路由器进入2、 进入系统视图3、更改设备名称为R14、使用同样的办法修改路由器R2、R3 二、配置路由物理接口的IP 地址1、查看R1路由器当前接口IP 地址配置与路由表2、查看路由器上的路由表…...
详解SQL数据定义功能
数据定义 1. 数据库模式(Schema)的定义与删除定义模式删除模式 2. 基本表的定义、修改与删除定义表约束1. NOT NULL 约束2. DEFAULT 约束3. UNIQUE 约束4. PRIMARY KEY 约束多列主键示例: 5. FOREIGN KEY 约束6. CHECK 约束7. AUTO_INCREMENT…...
vscode python相对路径的问题
vscode python相对路径的问题 最近使用使用vscode连接wsl2写python时,经常遇到找不到包中的方法的问题,最终发现vscode在执行python代码时目录不是从当前python文件开始算起,而是从当前工作区的目录开始算起,比如说我打开的是/ho…...
通达信软件+条件选股+code
在通达信软件中,你的选股公式需要放在 "公式管理器" 的 "条件选股公式" 分类中。以下是详细操作步骤: 一、打开公式管理器 打开通达信软件,按快捷键 Ctrl + F (或点击顶部菜单栏:"公式" → "公式管理器") 二、创建新公式 选择分…...
机器学习常见激活函数
激活函数的作用 引入非线性因素 若神经网络仅由线性层构成,那么无论网络的层数有多少,其整体的输出依然是输入的线性组合。这样的网络只能拟合线性函数,在处理复杂的非线性问题(如语音识别、图像分类)时能力十分有限。…...
Unreal Engine 5(虚幻引擎)动画制作快捷键大全
Unreal Engine 5 中 动画制作(主要涉及 Sequencer、动画蓝图等模块)的 鼠标操作 与 核心快捷键 整理,按动画制作流程分类: 一、Sequencer 时间轴操作 功能目标鼠标操作快捷键说明移动播放头左键点击时间轴标尺区域拖动播放头按住…...
OpenFeign的配置类可以进行哪些配置
1. 日志级别(Logger Level) 工作原理 Feign的日志级别控制了日志输出的详细程度,有助于调试和监控。日志级别包括: NONE:不记录任何信息。BASIC:仅记录请求方法和URL及响应状态码和执行时间。HEADERS&am…...
netcore publish报错 error CS1056: Unexpected character
问题:jenkins netcore publish报错 检查文件编码,发现是:GB2312。转换为:UTF-8-BOM。 问题解决 。...
网页制作14-Javascipt时间特效の显示动态日期
<!doctype html> <html> <head> <meta charset"utf-8"> <title>动态日期</title> </head><script>var today new Date();//获取时间var ytoday.getFullYear();//截取年var mtoday.getMonth();//截取月份,返回0~11v…...
《高效迁移学习:Keras与EfficientNet花卉分类项目全解析》
从零到精通的迁移学习实战指南:以Keras和EfficientNet为例 一、为什么我们需要迁移学习? 1.1 人类的学习智慧 想象一下:如果一个已经会弹钢琴的人学习吉他,会比完全不懂音乐的人快得多。因为TA已经掌握了乐理知识、节奏感和手指…...
