之前对于树状结构的处理没什么困难,但是最近的一个需求就很麻烦。其实遍历出树状结构并不是什么困难的事情,但是这个需求需要从底层节点统计数量,然后向上修改所有的父级结构。

最难的地方就是这个地方,可能有的子节点大部分是最后一级,但是平级可能还会有多层数据。之前试过用递归结构实现。但是容易造成死锁,原因就是在向上修改数据时平级的子节点也在

向上修改,就会造成死锁。这个需求搁置了很久,一直没有什么好办法。

直到前几天浏览文章时突然看到了,stream流的排序功能,突然思如泉涌。排序算法可以自定义还能支持多层排序,一步一步梳理完成。

我的思路是这样的,先拿到所有的二级结构,因为二级结构需要做最后的数据汇总,然后遍历出所有的二级结构树,这里可能数据库的设计师不一致的。但是,思路可以通用,这边我这个数

据里面保存了一个节点路径,

先使用条件限定查找范围,因为字符串的匹配可能不精确。通过二级节点搜索包含节点id的路径,用list集合包装起来。这样每个二级节点就是一个单独的树,再做处理就方便多了。

如果没有好的条件可以快速定位节点,建议使用递归,通过关联关系遍历获取数据。建议存入list集合,因为只在后台计算的话逆向遍历树结构很麻烦。这是一个树结构的实体

如果是这种结构的话,遍历太容易死锁。然后对这几个list集合进行排序,这里有个示例,通过子父id进行排序

list.stream().sorted((s1,s2)->{

if(s1.getPid = s2.getId){

return 1;

}

}).forEach(System.out::println);

如果还有其他的排序需求,直接接上thenCompaing可继续对集合进行排序。然后用stream中的limit方法切割集合,找到集合中id不作为任何元素PID的数据,从这个位置开始切割。然后开始对数据进行处理。第一位的数据就是你的第三层结构,注意这里要对你的一级二级结构做判断如果没有下级就直接修改,然后吧第三级汇总至第二级,最后用stream流求第二级总和,存入第一级节点就ok。说起来很绕,但是面对树状结构最好使用图数据库,或者添加路径以及其他索引方式,不要只用子父id对应。

java 树形数据_JAVA处理树状结构数据相关推荐

  1. java 树形数据_JAVA获取树形结构数据

    获取树形结构通常使用的方法是递归查询,但是递归循环比较多,查询数据库比较频繁,性能还有代码都比较繁琐. 现我们可以使用引用复制的方法获取树结构. 实现代码如下,我们用菜单做实例. list 只需要获取 ...

  2. Java - 树状结构数据解析

    由于工作中好多地方需要树状结构数据,在参考了网上递归实现和数据库存储过程实现,都不太满意.突然想到zTree也有解析该类数据的要求,所以在阅读了zTree源码的前提了,按照他的实现原理,写了一个jav ...

  3. Java递归子集算法(树状结构)的逻辑和实例代码实现 @杨章隐

    Java递归算法(树状结构)的逻辑和实例 1.应用场景: 递归算法作为一个经常使用的算法,无论在API开发还是计算文件夹都是比较常用的, 在api开发过程中我们经常遇到需要返回树状结构的json 例如 ...

  4. Java 通过使用递归函数实现树状结构

    项目中遇到一个接口,需要根据部门级别返回一个树状结构,包括部门,子部门,和部门下的员工,其结构如下: {"code": 0,"data": [{"no ...

  5. java 迁移数据_Java 10迁移:轻而易举还是龙卷风?

    java 迁移数据 "对于基础架构提供商而言,升级到最新的JDK根本不容易" Java 10是在几周前发布的,但我们仍在剖析其最重要的功能(*咳嗽*局部变量类型推断*咳嗽*)以及那 ...

  6. mysql如何实现树状结构数据列表

    1.数据库设计 CREATE TABLE `expense_type` (`ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '费用类型唯一主键ID',`NAME ...

  7. 使用递归遍历树状结构数据

    递归遍历树状结构 datas:[{id: 1,name: '分组1',expand: true,type:'group',editable:false,active:false,children: [ ...

  8. 树状结构数据查询方法

    需求 需要查询组织架构下所有部门数据,这里层级有多深我们并不知道,所以不能通过for循环指定次数来遍历,看这个图 解决方案 参考了一些文档大概意思就是--使用递归(名词解释:程序调用自身的编程技巧称为 ...

  9. java 静态数据_Java 静态数据初始化的示例代码

    无论创建多少个对象,静态数据都只占用一份存储区域.static关键字不能应用于局部变量,因此它只能作用于域.如果一个域是静态的基本类型域,且也没有对它进行初始化,那么它就会获得基本类型的标准初始值:如 ...

最新文章

  1. 4.8 这和大脑有什么关系-深度学习第一课《神经网络与深度学习》-Stanford吴恩达教授
  2. MySQL中索引与视图的用法与区别详解
  3. python/numpy将矩阵保存为文本文件
  4. ubuntu 重定向
  5. Last_Error: Slave SQL thread retried transaction 10 time(s) in vain, giving up导致主从不同步的解决方法
  6. RocketMQ中消息的优先级
  7. C++ 空类,默认产生哪些成员函数
  8. TensorFlow HOWTO 5.1 循环神经网络(时间序列)
  9. GNOME下也是Alt+F2,输入gnome-terminal
  10. 跟想这台计算机usb无法识别,无法识别的USB设备:跟这台计算机连接的一个USB设备运行不正常,WINDOWS无法识别...
  11. [转]浅谈php web安全
  12. idea 配置J2EE
  13. esxi命令关机虚拟机_虚拟机镜像使用说明
  14. LINUX检查一个进程内存增长的脚本
  15. 腾讯产品策划类笔试题
  16. STM32官方USB库下载指南
  17. Bada学习-SDK的安装
  18. PySpark 之 连接变换 union、intersection、subtract、cartesian
  19. 三星电视机dns服务器维护,4招解救三星智能电视看视频卡顿问题
  20. 计算机文化基础——计算机基础知识

热门文章

  1. 【DockerCE】Docker-CE 20.10.21正式版发布
  2. EA交易的自我优化: 进化与遗传算法
  3. 3D点云系列(一)点云介绍
  4. NAS 详细搭建方案 - 安装Aria2
  5. 汽车ECU的内部构成与功能模块
  6. 明翰英语教学系列之时态与语态篇
  7. 激活函数,损失函数以及学习率
  8. 在本地部署自己的漏洞文章武器库(详细步骤说明)
  9. C语言一维波动方程,地震数值模拟毕业设计(31页)-原创力文档
  10. java.awt.color,AWT Color类