数据结构转换,列表 转 树 机构
看了很多晚上列表转树的方案,感觉都不太好,这次要写一个,就把自己用的分享出来
自己感觉还很不错,直接上代码说吧
1,对象的类型
@Data public class SystemAuth implements Serializable { /** *权限id */ private Integer authid ; /** *父权限id */ private Integer parentid ; /** *子权限id集合列表 */ private List<SystemAuth> children; }
对象开始的时候,只有authid,以及parentid ,构建树之后,会把parentid是当前authid的全部放到子权限id列表的集合中,以此类推。
2.构建树,直接上方法内部的精华
//查询数据库,查询出需要建树的列表集合
Set<SystemAuth> authIdsAndAuthType = systemAuthMapper.findAuths();
//创建一个list,存放所有最顶层节点
List<SystemAuth> list=new ArrayList<>();
//创建map ,用来存放所有已构建树的节点,可以方便查找父级节点
final HashMap<Integer,SystemAuth> map = new HashMap<>();
//对数据进行排序,根据父id顺序排,保证优先处理父节点,根据子查父的时候,永远都会存在(精华所在)
authIdsAndAuthType.stream().sorted((s1,s2)->s1.getParentid()-s2.getParentid())
.forEach(item->{
//把当前节点放到map中,为之后该节点的子节点使用时可以顺利找到
map.put(item.getAuthid().intValue(),item);
//获取当前节点的父节点,
SystemAuth parentitem = map.get(item.getParentid().intValue());
//存在父节点
if(parentitem!=null){
//父节点下子节点list没有创建的时候,就创建该list
if(parentitem.getChildren()==null){
parentitem.setChildren(new ArrayList<SystemAuth>());
}
//把该节点放到该父节点下
parentitem.getChildren().add(item);
}else {
//如果父节点不存在,就把该节点放到顶级节点下,因为已经排序,可以确保如果不存在,就一定是顶级节点。
list.add(item);
}
});
return list
大功告成,本方法使用了一次排序,一次循环。
以及最重要的,list 里面装的对象,和map中装的对象是同一个对象,这样就可以保证,在map中查找的父节点下存放子节点时,list 中的父节点也会被同步存放了,最后返回list 根节点时,所有的对象都以及OK啦。
最后说一下这个方案的局限性,该方案仅适合id自增长的数据生成树,如果id是uuid 或者字符串则该方案无法处理,另外,这个方案排序一定是要现有父节点再有子节点的,也就是说,父节点的id一定要比子节点id小(id自增长)。

浙公网安备 33010602011771号