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

【Java】树结构数据的搜索

这里写自定义目录标题

  • 需要实现的效果
  • 前端需要的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 判断了两次了,这其实没必要。还可以优化一下。

    @Overridepublic 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.lryc.cn/news/136756.html

相关文章:

  • ElementUI中的日历组件加载无效的问题
  • Git版本管理(03)stash临时操作和.gitignore配置
  • 【ThingJS | 3D可视化】开发框架,一站式数字孪生
  • SpringBoot返回响应排除为 null 的字段
  • 华为数通方向HCIP-DataCom H12-821题库(单选题:41-60)
  • OpenAI推出GPT-3.5Turbo微调功能并更新API;Midjourney更新局部绘制功能
  • 相机成像之3A算法的综述
  • 最新AI系统ChatGPT程序源码/微信公众号/H5端+搭建部署教程+完整知识库
  • OpenCV实例(九)基于深度学习的运动目标检测(二)YOLOv2概述
  • 【Docker】已经创建好的Docker怎么设置开机自启
  • E - Excellent Views
  • WiFi天线和NB-IoT天线不通用
  • IoT DC3 是一个基于 Spring Cloud 的开源的、分布式的物联网(IoT)平台本地部署步骤
  • VBA Excel自定义函数的使用 简单的语法
  • 字节跳动 从需求到上线全流程 软件工程流程 需求评估 MVP
  • 线性代数-矩阵的本质
  • React基础入门之虚拟Dom
  • C++基础Ⅰ编译、链接
  • VMware和ubuntu配置Hadoop环境
  • uview2.0自定义tabbar
  • Star History 月度开源精选|Llama 2 及周边生态特辑
  • 修改电脑上路由表使笔记本默认走无线
  • Spring Cache的介绍以及怎么使用(redis)
  • 软考高级系统架构设计师系列论文六十九:论信息系统的安全风险评估
  • Ubuntu系统安装之后首需要做的事情
  • Qt——QPushButton控件的常见属性、方法和信号
  • AUTOSAR规范与ECU软件开发(实践篇)5.5 基于ISOLAR-A的系统级设计与配置方法(上)
  • mongoDB的CRUD
  • flutter TARGET_SDK_VERSION和android 13
  • 大数据Flink(六十六):Flink的重要概念和小结