java将集合List转换为父子节点

前提:数据结构必须如下 

pid为一级菜单的时候有默认值

   /**
     * @Description: 将 list 转换为 树
    
     */
    public static List<Map<String, Object>> listToTree(List<Authority> list, Integer pId ) {
        final String STR_CHILDREN = "children";
        //空间换时间,所需要的空间
        HashMap<Object, Map<String, Object>> tempMap = new HashMap<>(list.size());
        //最顶层的根节点
        List<Map<String, Object>> rootList = new ArrayList<>();

        for (Authority node : list) {
            //当前节点名称
            Integer id = node.getId();
            //父节点名称
            Integer parentid = node.getPid();
            //处理当前节点,可能先处理父节点时,已经把该节点挂载子节点了,如果没有的话就新建一个
            Map<String, Object> packageBody = tempMap.getOrDefault(id, new HashMap<>());
            Map<String, Object> current = BeanUtil.beanToMap(node);
            //把之前添加的children信息拿过来,挂载到现在的node下。putIfAbsent
            current.putIfAbsent(STR_CHILDREN, packageBody.getOrDefault(STR_CHILDREN, new ArrayList<>()));
            tempMap.put(id, current);
            //处理顶级节点,parentid为null的情况下,为顶级节点
            if (parentid.equals(pId)) {
                rootList.add(current);
            } else {
                //把当前节点挂到父节点下
                //获取父节点,父节点不存在就先初始化一个
                Map<String, Object> parent = tempMap.getOrDefault(parentid, new HashMap<>());
                //父节点为空情况
                //1 还没处理到:创建一个, 2 没有父节点的子节点,坏的数据,丢进去,最后不会被挂到根节点下
                ArrayList<Map<String, Object>> children = (ArrayList) parent.getOrDefault(STR_CHILDREN, new ArrayList());
                parent.put("children", children);
                //把当前节点挂载到父节点下
                children.add(current);
                //把父节点也挂到map中放到节点下
                tempMap.put(parentid, parent);
            }
        }
        return rootList;
    }

方法中用到的BeanUtil.beanToMap来源于下面的依赖

<dependency>
	<groupId>cn.hutool</groupId>
	<artifactId>hutool-all</artifactId>
	<version>5.8.5</version>
</dependency>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿毕业分享网

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值