需求描述
目前大部分文章都是以全部组织一起展示,我需要对部门部分组织进行树形的结构的实现返回给前端,即找到目标部门,实现目标部门及其所有父部门组成树形返回,子部门不返回
直接上代码
实体类
import java.util.ArrayList;
import java.util.List;
public class Menu {
//id
private String id;
//菜单名
private String name;
//父节点id
private String pid;
//子节点信息
private List<Menu> children = new ArrayList<>();
//无参构造
public Menu() {}
//带参构造
public Menu(String id, String name, String pid) {
this.id = id;
this.name = name;
this.pid= pid;
}
public void setId(String id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setPid(String pid) {
this.pid = pid;
}
public void setChildren(List<Menu> children) {
this.children = children;
}
public String getId() {
return id;
}
public String getName() {
return name;
}
public String getPid() {
return pid;
}
public List<Menu> getChildren() {
return children;
}
}
实现方法
private List<Menu> getTree(List<Menu> menusNeed, List<Menu> menus) {
for (int i = 0; i < menusNeed.size(); i++) {
// 当前节点
Menu menu1 = menusNeed.get(i);
// 当前节点父节点(每个节点只有一个父节点)
List<Menu> list = menus.stream().filter(menu ->
Objects.equals(menu1.getPid(), menu.getId())
).collect(Collectors.toList());
// 有父节点的情况
if (list.size() > 0) {
// 判断当前节点的父节点是否已经存在need列表中
boolean b = menusNeed.stream().anyMatch(menu ->
Objects.equals(list.get(0).getId(), menu.getId()));
if (!b){
// 不存在则将其加入need列表
menusNeed.addAll(list);
// 将当前节点加入其父节点的孩子中组成树
Menu last = menusNeed.get(menusNeed.size() - 1);
last.getChildren().add(menu1);
}else {
// 存在则找出need中的已存在的父节点,将当前节点设置给它
// 注:
for (Menu menu : menusNeed) {
if (Objects.equals(menu.getId(), list.get(0).getId())){
menu.getChildren().add(menu1);
break;
}
}
}
}
}
// 筛选出根节点即可
List<Menu> list = menus.stream().filter(menu ->
Objects.equals(menu.getPid(), "0")
).collect(Collectors.toList());
return list;
}
main方法检测
public static void main(String[] args) {
// 所有节点
List<Menu> menus = new ArrayList<>();
menus.add(new Menu("1", "根节点", "0"));
menus.add(new Menu("2", "子节点1", "1"));
menus.add(new Menu("3", "子子节点1.1", "2"));
menus.add(new Menu("6", "子子子节点1.1.1", "3"));
menus.add(new Menu("4", "子节点2", "1"));
menus.add(new Menu("5", "子子节点2.1", "4"));
menus.add(new Menu("7", "根节点q", "0"));
menus.add(new Menu("8", "子节点q1", "7"));
menus.add(new Menu("9", "子子节点q1.1", "8"));
menus.add(new Menu("12", "子子子节点q1.1.1", "9"));
menus.add(new Menu("10", "子节点q2", "7"));
menus.add(new Menu("11", "子子节点q2.1", "10"));
// 需要的目标节点
List<Menu> menusNeed = new ArrayList<>();
menusNeed.add(new Menu("3", "子子节点1.1", "2"));
menusNeed.add(new Menu("6", "子子子节点1.1.1", "3"));
menusNeed.add(new Menu("5", "子子节点2.1", "4"));
menusNeed.add(new Menu("11", "子子节点q2.1", "10"));
List<Menu> tree = getTree(menusNeed, menus);
System.out.println();
}
由于遍历了need集合中每一个menu,后续的话如果想在部门中添加用户信息可按需添加