JAVA处理树状结构数据

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

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

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

  直到前几天浏览文章时突然看到了,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对应。

  

posted @ 2020-08-11 17:28  BrightFl  阅读(1416)  评论(0编辑  收藏  举报