JAVA通过TreeMap构建树形目录
定义节点类
首先定义节点类,树形包括其Id、父节点Id、子节点列表:
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Node {
private String id;
private String parentId;
private List<Node> children;
}
定义待排序的节点列表
List<Node> nodes = new ArrayList<>();
nodes.add(new Node("001", "", new ArrayList<>()));
nodes.add(new Node("003", "001", new ArrayList<>()));
nodes.add(new Node("002", "001", new ArrayList<>()));
nodes.add(new Node("004", "003", new ArrayList<>()));
nodes.add(new Node("005", "", new ArrayList<>()));
nodes.add(new Node("006", "005", new ArrayList<>()));
构建树形目录的算法
public static List<Node> getTreeByNodes(List<Node> nodes) {
Map<String, Node> nodeMap = new TreeMap<>();
for (Node node : nodes) {
//将所有节点放进TreeMap这数据结构中
nodeMap.put(node.getId(), node); //因为这里的node是引用传递所以才可进行下面操作
}
for (Node node : nodes) {
if (nodeMap.containsKey(node.getParentId())) {
nodeMap.get(node.getParentId()).getChildren().add(node);
}
}
//通过流操作选择根节点返回为一个Node的列表
return nodes.stream().filter(node -> node.getParentId().equals("")).collect(Collectors.toList());
}
输出结果
在控制台打印:
System.out.println(getTreeByNodes(nodes).toString());
输出:
[Node(id=001, parentId=, children=[Node(id=003, parentId=001, children=[Node(id=004, parentId=003, children=[])]), Node(id=002, parentId=001, children=[])]),
Node(id=005, parentId=, children=[Node(id=006, parentId=005, children=[])])]