如何将列表数据转化为树型数据(二)

整体思路是将之前的对象,用List<Map<String, Object>>的方式包起来。
Map作为树中的“节点”,其中有两个key,data--数据本身,children--又一个List<Map<String, Object>>存放子“节点”。

总的来说分两步。

第一步,将所有parent值为null的节点先放入最后返回的结果集中。
因为这些值没有父节点,必定在树型结果集的第一层,可以率先放入。
parent为空的节点.png

由于是制作成工具,所以取id和parentId的操作使用了反射。
DATA_FIELD其实就是字符串常量,也就是上方提到的map中的"data"字段。
map.put((String) getSelfIdMethod.invoke(node), true)这句话后面会做解释。

第二步,遍历所有列表数据,并依次添加进现有的树型结果集中。
遍历剩余的列表数并加入树型结果集中.png

同理,map.put((String)getSelfIdMethod.invoke(node), true)同理这句话后面作解释。

添加进树型结果集方法.png

在理解了这两个核心步骤的前提下,现在来解释关于上面方法中的map的问题。
上面的方法存在一个问题,就是列表结果集(list)本身数据的顺序是数据库查出来的,也就是不确定的。
如果按照顺序方式只遍历一遍来放入树型结果集(resultList)中,那么有可能出现这样一种情况。
如:节点B的父节点是A,同样A也有父节点(有父节点的意思是不保证A在第一步中会被率先放入)。
但是在list中,B是在比A更靠前的位置,所以可能出现,企图将B加入树型结果集的时候,A还不存在结果集里。
这次遍历中,B便无法放入树型结果集中,那么如果只遍历一次,B就被遗漏了。

目前第一版解决方案就是图中的方法,将已经放入resultList的节点存入map。
并一直循环直到确保所有list数据都放入resultList才停止。


map解决列表顺序问题.png

现在我们能确保所有结果都能放入resultList了。但是如图,我们面临了新的问题。

数据库的数据如果让数据成环,比如两列数据互为parent这种情况。
while (map.size() < list.size())这句代码会让这个方法进入死循环。
下一节我们继续解决这个问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。