package com.zving.tree;
import java.util.ArrayList;
import java.util.List;
/**
* 树形结构实体类
* @author clove
*/
public class Node {
private int id;
private int pid;
private String name;
private String type;
private List<Node> children = new ArrayList<>();
public Node(int id, int pid) {
this.id = id;
this.pid = pid;
}
public Node(int id, int pid, String name, String type) {
this(id, pid);
this.name = name;
this.type = type;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getPid() {
return pid;
}
public void setPid(int pid) {
this.pid = pid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public List<Node> getChildren() {
return children;
}
public void setChildren(List<Node> children) {
this.children = children;
}
}
package com.zving.tree;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TreeController {
@RequestMapping("/tree")
public List<Node> getTree() {
List<Node> nodeList = getNodeList();
List<Node> tree = buildTree(nodeList);
return tree;
}
// 初始化数据集合
private List<Node> getNodeList() {
List<Node> list = new ArrayList<Node>();
Node node1 = new Node(1, 0, "公司库", "股票");
Node node2 = new Node(2, 0, "基金库", "基金");
Node node3 = new Node(111, 1, "A股市场", "股票");
Node node4 = new Node(112, 1, "港股市场", "股票");
Node node5 = new Node(211, 2, "公墓基金池", "基金");
Node node6 = new Node(212, 2, "非公墓基金池", "基金");
Node node7 = new Node(11111, 111, "基础池", "股票");
Node node8 = new Node(21211, 212, "可买池", "基金");
list.add(node1);
list.add(node2);
list.add(node3);
list.add(node4);
list.add(node5);
list.add(node6);
list.add(node7);
list.add(node8);
return list;
}
// 封装集合为树形结构
private List<Node> buildTree(List<Node> nodes) {
Map<Integer, List<Node>> children = nodes.stream().filter(node -> node.getPid() != 0)
.collect(Collectors.groupingBy(node -> node.getPid()));
nodes.forEach(node -> node.setChildren(children.get(node.getId())));
return nodes.stream().filter(node -> node.getPid() == 0).collect(Collectors.toList());
}
}