非递归快速构建树

import lombok.Data;

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

/**
 * 树节点类
 *    如果需要扩展字段,继承该类直接扩展即可
 *    构建树调用: TreeNodeUtil.buildTree(List<T> orginals)
 */
@Data
public class TreeNode {

    /**
     * id,
     */
    private String id;

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

    /**
     *  父id
     */
    private String parentId;

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

    public TreeNode() {}

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

    /**
     * 添加子节点
     * @param node
     */
    public void addChild(TreeNode node) {
        this.children.add(node);
    }

}
import lombok.Data;

@Data
public class OrgVo extends TreeNode {

    private String orgId;

    private String label;

    private String orgPid;

    private int level;

    private int orderNo;

}
import cn.hutool.json.JSONUtil;

import java.util.*;

public class TreeNodeUtil {

    /**
     * 构建树方法,要求一级节点的父节点必须是“0”
     * @param orginals
     * @param <T>
     * @return
     */
    public static <T extends TreeNode> List<TreeNode> buildTree(List<T> orginals){
        // 创建Map,把所有原始数据的 id 作为 key,原始数据对象作为 value
        Map<String, TreeNode> dataMap = new LinkedHashMap<>();
        for (TreeNode node : orginals) {
            dataMap.put(node.getId(), node);
        }
        List<TreeNode> result = new ArrayList<>();
        for (Map.Entry<String, TreeNode> entry : dataMap.entrySet()) {
            TreeNode node = entry.getValue();
            if (node.getParentId().equals("0")) {
                // 如果是顶层节点,直接添加到结果集合中
                result.add(node);
            } else {
                // 如果不是顶层节点,找到父节点,然后添加到父节点的子节点中
                if (dataMap.get(node.getParentId()) != null) {
                    dataMap.get(node.getParentId()).addChild(node);
                }
            }
        }
        return result;
    }

    public static void main(String[] args) {
        List<OrgVo> orginals = new ArrayList<>();
        for (int i = 1; i <= 1000; i++) {
            OrgVo orgVo = new OrgVo();
            orgVo.setOrgId(i + "");
            orgVo.setLabel("name" + i);
            orgVo.setOrgPid("0");
            orgVo.setLevel(1);
            orgVo.setOrderNo(i);

            // 必须设置 id 和 parentId,构建树时使用
            orgVo.setId(orgVo.getOrgId());
            orgVo.setParentId(orgVo.getOrgPid());
            orginals.add(orgVo);
        }
        for (int i = 1001; i <= 2000; i++) {
            OrgVo orgVo = new OrgVo();
            orgVo.setOrgId(i + "");
            orgVo.setLabel("name" + i);
            orgVo.setOrgPid("1");
            orgVo.setLevel(1);
            orgVo.setOrderNo(i);

            // 必须设置 id 和 parentId,构建树时使用
            orgVo.setId(orgVo.getOrgId());
            orgVo.setParentId(orgVo.getOrgPid());
            orginals.add(orgVo);
        }
        for (int i = 2001; i <= 3000; i++) {
            OrgVo orgVo = new OrgVo();
            orgVo.setOrgId(i + "");
            orgVo.setLabel("name" + i);
            orgVo.setOrgPid("1001");
            orgVo.setLevel(1);
            orgVo.setOrderNo(i);

            // 必须设置 id 和 parentId,构建树时使用
            orgVo.setId(orgVo.getOrgId());
            orgVo.setParentId(orgVo.getOrgPid());
            orginals.add(orgVo);
        }
        for (int i = 3001; i <= 4000; i++) {
            OrgVo orgVo = new OrgVo();
            orgVo.setOrgId(i + "");
            orgVo.setLabel("name" + i);
            orgVo.setOrgPid("2001");
            orgVo.setLevel(1);
            orgVo.setOrderNo(i);

            // 必须设置 id 和 parentId,构建树时使用
            orgVo.setId(orgVo.getOrgId());
            orgVo.setParentId(orgVo.getOrgPid());
            orginals.add(orgVo);
        }
        for (int i = 4001; i <= 5000; i++) {
            OrgVo orgVo = new OrgVo();
            orgVo.setOrgId(i + "");
            orgVo.setLabel("name" + i);
            orgVo.setOrgPid("3001");
            orgVo.setLevel(1);
            orgVo.setOrderNo(i);

            // 必须设置 id 和 parentId,构建树时使用
            orgVo.setId(orgVo.getOrgId());
            orgVo.setParentId(orgVo.getOrgPid());
            orginals.add(orgVo);
        }
        for (int i = 5001; i <= 6000; i++) {
            OrgVo orgVo = new OrgVo();
            orgVo.setOrgId(i + "");
            orgVo.setLabel("name" + i);
            orgVo.setOrgPid("4001");
            orgVo.setLevel(1);
            orgVo.setOrderNo(i);

            // 必须设置 id 和 parentId,构建树时使用
            orgVo.setId(orgVo.getOrgId());
            orgVo.setParentId(orgVo.getOrgPid());
            orginals.add(orgVo);
        }
        long start = System.currentTimeMillis();
        System.out.println("数据大小:"+orginals.size());
        List<TreeNode> treeNodes = TreeNodeUtil.buildTree(orginals);
//        System.out.println(JSONUtil.toJsonStr(treeNodes));
        System.out.println("耗时:"+(System.currentTimeMillis() - start));

    }

}
posted @ 2024-09-04 09:09  java小天地  阅读(10)  评论(0编辑  收藏  举报