- 这是一个简单的利用HashMap将一个数组组装成一棵树的代码 可能有多个根节点
- 核心发放为createTree 输入参数分别为 对象数组,id get方法,pid get方法 使其能兼容数据类型。不需要指定特定的成员信息
- 节点对象除了保存对象信息,只保留了上级节点信息和子节点列表信息。
- 如果有什么不适用的状况欢迎提出
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
public class TreeUtils {
public static <T> List<TreeNode<T>> createTree(List<T> dataList, Function<T,Number> idGet, Function<T,? extends Number> pidGet) {
Map<Number, TreeNode<T>> idMapper = new HashMap<>();
for (T node : dataList) {
Number id = idGet.apply(node);
TreeNode<T> tTreeNode = new TreeNode<>(node);
idMapper.put(id, tTreeNode);
}
for (TreeNode<T> currentNode : idMapper.values()) {
Number pid = pidGet.apply(currentNode.getData());
if (pid != null && idMapper.containsKey(pid)) {
TreeNode<T> pNode = idMapper.get(pid);
pNode.addChild(currentNode);
currentNode.setParentNode(pNode);
}
}
List<TreeNode<T>> collect = idMapper.values().stream().filter((o) -> o.getParentNode() == null).collect(Collectors.toList());
return collect;
}
public static void main(String[] args) {
ArrayList<TreeBaseEntity> list = new ArrayList();
list.add(new TreeBaseEntity(1L, "", 0L));
list.add(new TreeBaseEntity(2L, "", 0L));
list.add(new TreeBaseEntity(3L, "", 0L));
list.add(new TreeBaseEntity(4L, "", 3L));
list.add(new TreeBaseEntity(5L, "", 4L));
list.add(new TreeBaseEntity(6L, "", 5L));
list.add(new TreeBaseEntity(7L, "", 3L));
list.add(new TreeBaseEntity(8L, "", 4L));
list.add(new TreeBaseEntity(9L, "", 5L));
List<TreeNode<TreeBaseEntity>> tree = TreeUtils.createTree(list, TreeBaseEntity::getId, TreeBaseEntity::getQuoteId);
System.out.println("finish");
}
public static class TreeNode<T> {
private TreeNode<T> parentNode;
private List<TreeNode<T>> nodes = new ArrayList<>();
private T data;
public TreeNode(T data) {
this.data = data;
}
public void addChild(TreeNode<T> node) {
nodes.add(node);
}
public TreeNode() {
}
public TreeNode<T> getParentNode() {
return parentNode;
}
public void setParentNode(TreeNode<T> parentNode) {
this.parentNode = parentNode;
}
public List<TreeNode<T>> getNodes() {
return nodes;
}
public void setNodes(List<TreeNode<T>> nodes) {
this.nodes = nodes;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
public static class TreeBaseEntity {
private Long id;
private String code;
private String text;
private Long quoteId;
public TreeBaseEntity() {
}
public TreeBaseEntity(Long id, String text, Long quoteId) {
super();
this.id = id;
this.text = text;
this.quoteId = quoteId;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getQuoteId() {
return quoteId;
}
public void setQuoteId(Long quoteId) {
this.quoteId = quoteId;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
}