如上图,这就是我想投建出来的树形结构目录(后面贴图)
我就直接说了,我不会,我是百度出来的,这里就大概给你们讲讲。
直接上代码吧。
一个Node 类,用来定义每个节点拥有的值。
package com.example.myapp.tree;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author dcong
* @package_name:com.example.myapp.tree
* @date: 2021/1/25
* @desc: 就是使用lombok 构建一个实体
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Node {
/**
* id
*/
private int id;
/**
* 父节点id
*/
private int pid;
/**
* 名称
*/
private String name;
/**
* 子节点
*/
private List<Node> children;
}
然后就是构建的代码类
package com.example.myapp.tree;
import avro.shaded.com.google.common.collect.Lists;
import com.alibaba.fastjson.JSON;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author dcong
* @package_name:com.example.myapp.tree
* @date: 2021/1/25
* @desc: 构建和调用的类
*/
public class Build {
public static void main(String[] args) {
// 暂时使用main函数,需要定义一个类对象
Build build = new Build();
// 构建node节点
Node dennis = new Node(1, 0, "dennis", null);
Node calm = new Node(2, 0, "calm", null);
Node daughter = new Node(3, 1, "daughter", null);
Node grandson = new Node(4, 3, "grandson",null);
Node son = new Node(5, 2, "son", null);
// 构建出想要的树形数据
List<Node> nodes = Lists.newArrayList(dennis, calm, daughter, son, grandson);
List<Node> tree = build.buildTree(nodes);
System.out.println(JSON.toJSONString(tree));
}
public List<Node> buildTree(List<Node> nodes){
// 找到所有的子节点
// 这一句有一点的复杂就是通过pid 不等于0来进行过滤,然后通过pid进行排序,然后存储起来
Map<Integer, List<Node>> sub = nodes.stream().filter(node -> node.getPid() != 0).collect(Collectors.groupingBy(node->node.getPid()));
// 通过子节点的id,从sub里面找到 node 的子节点
nodes.forEach(node -> node.setChildren(sub.get(node.getId())));
// 最后根据pid为0的值(相当与是根节点)输出
return nodes.stream().filter(node -> node.getPid() == 0).collect(Collectors.toList());
}
}
这里面有注释,你们大概看一下就会理解的,然后根据自己的业务,来修改这个代码,就是这里的buildTree代码