【Java】树结构数据的搜索

news2025/1/11 18:09:30

这里写自定义目录标题

  • 需要实现的效果
  • 前端需要的json格式:一定是一个完整的树结构
    • 错误
      • 错误的返回格式
      • 错误的返回格式实现的效果
    • 正确
      • 正确的返回格式
      • 正确的展示画面
  • 后端
    • 逻辑分析
    • 代码总览
  • 数据库表结构

需要实现的效果

在这里插入图片描述

前端需要的json格式:一定是一个完整的树结构

错误

错误的返回格式

在这里插入图片描述

错误的返回格式实现的效果

在这里插入图片描述

正确

正确的返回格式

在这里插入图片描述

正确的展示画面

在这里插入图片描述

后端

逻辑分析

1. 根据搜索条件,查出符合的数据

List<ReproductiveCycleInfo> list = reproductiveCycleInfoMapper.selectReproductiveCycleInfoList(reproductiveCycleInfo);

在这里插入图片描述
这一步不能直接返回给前端的,因为前端的组件是需要完整的一个树结构。
从图中可以看到,我们 id in(70,71,72)的父节点 id = 17 没有找到,所以 这就不是一个完整的树结构。

2. 符合的数据里面我们需要发现还需要找到几个父节点数据

// parentId = 0,表示他已经没有父节点了
Set<Long> collect = list.stream().filter(x -> x.getParentId() != 0).map(ReproductiveCycleInfo::getParentId).collect(Collectors.toSet());

在这里插入图片描述
3. 开始找父节点的信息

        if (StringUtils.isNotEmpty(collect)) {
            for (Long x : collect) {
                getParentInfoByParentId(x, list);
            }
        }

3.1 根据节点的id找到节点

    /**
     * 根据节点id找出节点,并添加到结果集里面
     *
     * @param nodeId 当前需要找的节点id
     * @param list 返回的结果集
     */
    private void getNodeByParentId(Long nodeId, List<ReproductiveCycleInfo> list) {
        // 1. 如果当前需要找的节点
        if (nodeId != 0) {
            // 2. 为了避免父节点也已经出现在 所有的节点信息 里面
            // 2.1 找出当前所有的节点信息
            List<Long> ids = list.stream().map(ReproductiveCycleInfo::getId).collect(Collectors.toList());
            // 2.2 当前所有的节点信息不包含当前需要找的节点
            if (!ids.contains(nodeId)) {
                // 3. 从数据库里面,根据父节点的id,找到父节点信息
                ReproductiveCycleInfo one = reproductiveCycleInfoMapper.selectReproductiveCycleInfoById(nodeId);
                // 4. 把当前节点放到所有节点里面
                list.add(one);
                // 5. 如果当前节点还存在父节点
                if (one.getParentId() != 0) {
                    // 6. 递归去找父节点信息
                    getNodeByParentId(one.getParentId(), list);
                }
            }
        }
    }

以找17节点为例子:
在这里插入图片描述

代码总览

从这里也可以看出我这里其实代码已经有逻辑耦合了。毕竟 node != 0 判断了两次了,这其实没必要。还可以优化一下。

    @Override
    public List<ReproductiveCycleInfo> selectReproductiveCycleInfoListByName(ReproductiveCycleInfoDto reproductiveCycleInfo) {
        List<ReproductiveCycleInfo> list = reproductiveCycleInfoMapper.selectReproductiveCycleInfoList(reproductiveCycleInfo);
        Set<Long> collect = list.stream().filter(x -> x.getParentId() != 0).map(ReproductiveCycleInfo::getParentId).collect(Collectors.toSet());
        if (StringUtils.isNotEmpty(collect)) {
            for (Long x : collect) {
                getNodeByParentId(x, list);
            }
        }
        return list;
    }

    /**
     * 根据节点id找出节点,并添加到结果集里面
     *
     * @param nodeId 当前需要找的节点id
     * @param list 返回的结果集
     */
    private void getNodeByParentId(Long nodeId, List<ReproductiveCycleInfo> list) {
        // 1. 如果当前需要找的节点
        if (nodeId != 0) {
            // 2. 为了避免父节点也已经出现在 所有的节点信息 里面
            // 2.1 找出当前所有的节点信息
            List<Long> ids = list.stream().map(ReproductiveCycleInfo::getId).collect(Collectors.toList());
            // 2.2 当前所有的节点信息不包含当前需要找的节点
            if (!ids.contains(nodeId)) {
                // 3. 从数据库里面,根据父节点的id,找到父节点信息
                ReproductiveCycleInfo one = reproductiveCycleInfoMapper.selectReproductiveCycleInfoById(nodeId);
                // 4. 把当前节点放到所有节点里面
                list.add(one);
                // 5. 如果当前节点还存在父节点
                if (one.getParentId() != 0) {
                    // 6. 递归去找父节点信息
                    getNodeByParentId(one.getParentId(), list);
                }
            }
        }
    }

数据库表结构

起码得满足有这些极端并约定 parentId = 0 是表示是首节点了.
在这里插入图片描述

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

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

相关文章

数据中心电网不稳定,靠什么维护关键数据?

在现代科技驱动的世界中&#xff0c;机房成为了支撑着关键业务和信息流动的核心枢纽。而在机房中&#xff0c;持续稳定的电源是确保各项业务不中断运行的关键要素之一。 为了实现这一目标&#xff0c;机房柴油发电机监控系统应运而生&#xff0c;以强大的技术能力和智能化的特性…

低代码解放生产力,助力企业高效发展

近年来&#xff0c;随着数字化转型的推进&#xff0c;企业对于软件开发的需求日益显著。然而&#xff0c;传统的软件开发模式通常需要耗费大量时间和资源&#xff0c;限制了企业的快速响应能力。为了解决这一难题&#xff0c;低代码开发平台应运而生&#xff0c;成为企业和开发…

某多多商品平台数据采集

某多多商品平台数据采集 声明逆向目标寻找加密位置代码分析补环境补充内容声明 本文章中所有内容仅供学习交流,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者 无关,若有侵权,请私信我立即删除! 逆向目标 Anti-Content参数 寻找加密位置 先在控制台全局搜…

数据标注工具应该自研还是购买?

研发用于AI 模型数据标注解决方案的关键考虑因素 您想在业务中使用人工智能 (AI)&#xff0c;但如何确保选择最佳的推进策略&#xff1f;首先&#xff0c;您可能已确定业务问题、基于 AI 的解决方案及该解决方案的使用场景。但下一步要复杂一些。您可能正在考虑您的企业通过几…

Spring Boot通过企业邮箱发邮件被Gmail退回的问题解决方法

这两天给我们开发的Chrome插件&#xff1a;Youtube中文配音增加了账户注册和登录功能&#xff0c;其中有一步是邮箱验证&#xff0c;所以这边会在Spring Boot后台给用户的邮箱发个验证信息。如果发邮件&#xff0c;之前的文章教程里就有&#xff0c;这里就不说了&#xff0c;着…

【微信小程序】微信登录和手机号快捷登录:

文章目录 一、微信登录&#xff1a;【1】文档&#xff1a;【2】实现&#xff1a; 二、手机号快捷登录&#xff1a;【1】文档&#xff1a;【2】实现&#xff1a;【3】注意&#xff1a; 一、微信登录&#xff1a; 【1】文档&#xff1a; 【微信官方文档】https://developers.wei…

怎样压缩mp4视频大小?

怎样压缩mp4视频大小&#xff1f;由于视频文件的体积通常比其他类型的文件更大&#xff0c;因此它们需要更多的存储空间来保存。但是&#xff0c;如果我们的设备、应用程序或平台不支持某些视频格式或分辨率&#xff0c;或者我们没有足够的存储空间来容纳这些大型视频文件&…

ja-netfilter-all 使用介绍

反正我也要用ja-netfilter-all&#xff0c;这里就再总结下吧。 以下示例使用的是 pycharm-professional-2023.2.exe &#xff08;Windows版本&#xff09; 其他版本下载地址&#xff1a;pycharm/download/other 其他产品去官网自行下载&#xff1a;https://www.jetbrains.com…

如何将应用程序发布到 App Store

憧憬blog主页 在强者的眼中&#xff0c;没有最好&#xff0c;只有更好。我们是移动开发领域的优质创作者&#xff0c;同时也是阿里云专家博主。 ✨ 关注我们的主页&#xff0c;探索iOS开发的无限可能&#xff01; &#x1f525;我们与您分享最新的技术洞察和实战经验&#xff0…

软件测试认识

什么是软件测试&#xff1a;软件测试和调试区别测试和测试开发区别测试相关概念什么是需求什么是测试用例什么是bug软件生命周期 开发模型瀑布模型螺旋模型增量、迭代敏捷开发模型V模型W模型 什么是软件测试&#xff1a; 找bug&#xff1b;发现缺陷&#xff1b;验证功能&#…

线程简单随笔

线程安全性 原子性&#xff1a;synchornized、AtomicXXX、Lock ​ 原子性是指汇编指令不可拆分的&#xff0c;如同数据库中的事务&#xff0c;要么全部成功&#xff0c;要么全部失败一样 可见性&#xff1a;synchornized、volatile有序性&#xff1a;synchornized、volatile…

安装docker服务 配置镜像

1.安装docker服务&#xff0c;配置镜像加速器 2.下载系统镜像&#xff08;Ubuntu、 centos&#xff09; 3.基于下载的镜像创建两个容器 &#xff08;容器名一个为自己名字全拼&#xff0c;一个为首名字字母&#xff09; 4.容器的启动、 停止及重启操作 操作代码启动docker sta…

OLED透明屏硬性设计:产品设计中的创新之道

OLED透明屏作为一项革命性的技术创新&#xff0c;不仅具备透明度&#xff0c;而且还拥有硬性的特点&#xff0c;为各行业带来了前所未有的设计和应用可能性。 那么&#xff0c;在这篇文章中&#xff0c;尼伽将深入探索OLED透明屏的硬性设计优势&#xff0c;并通过相关数据和报…

ubuntu20.04安装gcc5.4 g++5.4

在进行ubuntu20.04的系统中安装gcc g5.4中&#xff0c;会出现安装问题 1、pip安装&#xff0c;失败 2、使用apt-get install 进行安装时&#xff0c;提示没有候选项&#xff1b; 原因&#xff1a;ubuntu20.04的系统下&#xff0c;系统默认安装的gcc9.0的版本&#xff0c;默认…

HVV爆火漏洞:最新 WPS RCE (远程命令执行) 复现

最近HVV爆出的很火的WPS命令执行漏洞&#xff0c;其实并不是0DAY&#xff0c;早在2019年就出现了&#xff0c;只不过最近EXP才公开。接下来我们来复现一遍。 0x00 影响版本 WPS Office 2023 个人版 < 11.1.0.15120WPS Office 2019 企业版 < 11.8.2.12085 0x01 环境配置…

光学成像传感器均匀性校准积分球光源

均匀光源被广泛应用于光学成像、遥感仪器的研制与标定等领域。积分球作为一种测量发光体光学参数的高效率仪器&#xff0c;常用于测量光谱强度与功率、光通量、散射体分布、颜色温度、电学特性等参数。积分球光源主要用途是可以作为参考源校准各种光度辐射仪器&#xff0c;其照…

数据结构与算法基础-学习-29-图之关键路径

图的其他相关知识点和源码分享可以参考之前的博客&#xff1a; 《数据结构与算法基础-学习-23-图之邻接矩阵与邻接表》&#xff0c; 《数据结构与算法基础-学习-24-图的遍历之DFS&#xff08;深度优先搜索&#xff09;和BFS&#xff08;广度优先搜索&#xff09;》&#x…

字节跳动 Git 的正确使用姿势与最佳实践

版本控制Git 黑马&尚硅谷 Git的前世今生 方向介绍 为什么要学习Git 1.0 Git是什么 1.1 版本控制 1.1.1 本地版本控制 1.1.2 集中版本控制 1.1.3 分布式版本控制 我们已经把三个不同的版本控制系统介绍完了&#xff0c;Git 作为分布式版本控制工具&#xff0c; 虽然目前来讲…

Python Web开发 OAuth2.0 简介

我们经常看到或者用到一些可以使用微博、微信、支付宝等账号登录的应用&#xff0c;还有一些微博助手、微信公众号助手、客户端之类的东西&#xff0c;这些是怎么做的呢&#xff0c;背后的原理是什么呢&#xff1f;为什么公众号配置起来那么繁琐呢&#xff1f;什么是 access to…

数据标注工具:功能及评估

从垃圾邮件过滤到个性化的聊天机器人体验&#xff0c;人工智能创新正日益成为我们日常生活中的一部分。大多数还没有部署人工智能的公司&#xff0c;都在考虑如何在其内部和外部流程中采用人工智能和机器学习工具。 在接触人工智能和机器学习前&#xff0c;很多人都不知道&…