Java构建树形结构,无第三方依赖实现
package top.zhangwen1712.utildemo.entity;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author Liu Kai
* @since 2023/11/24 13:50
*/
public class TreeNode<T> {
private Integer id;
private T node;
private Integer pid;
private List<TreeNode<T>> children;
public TreeNode(Integer id, T node, Integer pid) {
this.id = id;
this.node = node;
this.pid = pid;
this.children = new ArrayList<>();
}
public void addChild(TreeNode<T> child) {
this.children.add(child);
}
public Integer getId() {
return id;
}
public Integer getPid() {
return pid;
}
public T getNode() {
return node;
}
public List<TreeNode<T>> getChildren() {
return children;
}
/**
* 构建树结构
*
* @param treeNodes 节点集合
* @param <T> T
* @return 树结构
*/
public static <T> List<TreeNode<T>> build(List<TreeNode<T>> treeNodes) {
// List转Map
Map<Integer, TreeNode<T>> nodeMap = treeNodes.stream().collect(Collectors.toMap(TreeNode::getId, t -> t));
// 填充子节点
nodeMap.values().stream().filter(n -> n.getPid() != 0).forEach(n -> nodeMap.get(n.getPid()).addChild(n));
// 从顶级节点返回树结构
return treeNodes.stream().filter(t -> t.getPid() == 0).collect(Collectors.toList());
}
public static void main(String[] args) {
run();
}
public static void run() {
List<TreeNode<String>> arr = new ArrayList<>();
arr.add(new TreeNode<>(3, "门头沟", 2));
arr.add(new TreeNode<>(5, "晋中市", 4));
arr.add(new TreeNode<>(4, "山西省", 0));
arr.add(new TreeNode<>(2, "市辖区", 1));
arr.add(new TreeNode<>(8, "杏花岭区", 7));
arr.add(new TreeNode<>(6, "平遥县", 5));
arr.add(new TreeNode<>(1, "北京市", 0));
arr.add(new TreeNode<>(9, "辑虎营", 8));
arr.add(new TreeNode<>(7, "太原市", 4));
List<TreeNode<String>> build = build(arr);
printTree(build, 0);
}
/**
* 打印
*/
private static <T> void printTree(List<TreeNode<T>> tree, int depth) {
for (TreeNode<T> node : tree) {
// 缩进
for (int i = 0; i < depth; i++) {
System.out.print(" ");
}
System.out.println(node.getNode());
// 递归打印子节点
printTree(node.getChildren(), depth + 1);
}
}
}
Run
山西省
晋中市
平遥县
太原市
杏花岭区
辑虎营
北京市
市辖区
门头沟
Process finished with exit code 0
@Author:Liu Kai
@Location:北京