两次循环,生成多层树形结构

1、实体构造。

package com.ruoyi.web.suanfa;

import java.util.ArrayList;
import java.util.List;

public class TreeNode {
    /**
     * 节点Id
     */
    private Integer id;

    /**
     * 节点父ID
     */
    private Integer pid;

    /**
     * 节点名称
     */
    private String name;

    /**
     * 子节点
     */
    private List<TreeNode> children = new ArrayList<>();


    public TreeNode(Integer id, Integer pid, String name) {
        this.id = id;
        this.pid = pid;
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getPid() {
        return pid;
    }

    public void setPid(Integer pid) {
        this.pid = pid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<TreeNode> getChildren() {
        return children;
    }

    public void setChildren(List<TreeNode> children) {
        this.children = children;
    }
}

2、生成树形结构

package com.ruoyi.web.suanfa;

import org.apache.commons.collections.CollectionUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * @Author martin
 * @Description
 * @Date 2023/8/9
 **/
public class GenerateTree {
    public static List<TreeNode> generateTree(List<TreeNode> treeList) {
        if (CollectionUtils.isEmpty(treeList)) {
            return null;
        }
        Map<Integer, TreeNode> treeNodeMap = treeList.stream()
                .collect(Collectors.toMap(TreeNode::getId, Function.identity(), (o1, o2) -> o2));
        List<TreeNode> result = new ArrayList<>();
        for (TreeNode node : treeList) {
            if (node.getPid() == 0) {
                result.add(node);
                continue;
            }
            if (treeNodeMap.containsKey(node.getPid())) {
                treeNodeMap.get(node.getPid()).getChildren().add(node);
            } else {
                result.add(node);
            }
        }
        return result;
    }

    public static void main(String[] args) {
        List<TreeNode> tmp = new ArrayList<>();
        tmp.add(new TreeNode(1, 0, "一级"));
        tmp.add(new TreeNode(11, 0, "一级1"));
        tmp.add(new TreeNode(12, 0, "一级2"));

        tmp.add(new TreeNode(21, 1, "二级2"));
        tmp.add(new TreeNode(22, 1, "二级3"));
        tmp.add(new TreeNode(23, 1, "二级4"));

        tmp.add(new TreeNode(31, 11, "三级1"));
        tmp.add(new TreeNode(32, 11, "三级2"));
        tmp.add(new TreeNode(33, 11, "三级3"));

        tmp.add(new TreeNode(43, 21, "四级3"));
        tmp.add(new TreeNode(44, 21, "四级4"));
        tmp.add(new TreeNode(45, 22, "四级5"));

        tmp.add(new TreeNode(51, 43, "四级6"));
        tmp.add(new TreeNode(52, 43, "四级7"));
        tmp.add(new TreeNode(53, 44, "四级7"));
        List<TreeNode> list = generateTree(tmp);
        System.out.println(list.size());

    }
}

两次循环,比递归算法性能号太多了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值