看了很多晚上列表转树的方案,感觉都不太好,这次要写一个,就把自己用的分享出来
自己感觉还很不错,直接上代码说吧
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啦。
如果大家有什么更好的方案,可以给我留言哈!!!!
原文:https://www.cnblogs.com/see-saw/p/12125746.html