数据结构转换,列表 转 树 机构

看了很多晚上列表转树的方案,感觉都不太好,这次要写一个,就把自己用的分享出来

自己感觉还很不错,直接上代码说吧

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啦。

     如果大家有什么更好的方案,可以给我留言哈!!!!

猜你喜欢

转载自www.cnblogs.com/see-saw/p/12125746.html