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));
}
}