@Data
public class Tree {
/**
* 节点id
*/
private String id;
/**
* 节点父id
*/
private String pid;
/**
* 节点名称
*/
private String name;
@Override
public String toString() {
return "Tree [id=" + id + ", pid=" + pid + ", name=" + name + "]";
}
}
/**
* 递归类 (菜单树)
*
* @author ztw
* @date 2023/6/30
*/
public class MenuTree {
public MenuTree(List<Tree> trees) {
menuList(trees);
}
/**
* 临时变量,记录传入的节点
*/
private List<Tree> menuCommon;
/**
* 待返回的菜单树对象集
*/
private List<Object> list = new ArrayList<Object>();
/**
* 提供接口获取菜单树
*
* @return 菜单树
*/
public List<Object> getList() {return list;}
/**
* 组装菜单树
* 组装了的菜单树 存有第一级节点,每个节点又包含子节点集
*
* @param menu 数据集
*/
private void menuList(List<Tree> menu) {
this.menuCommon = menu;
for (Tree x : menu) {
// LinkedHashMap 双向链表
Map<String, Object> mapArr = new LinkedHashMap<String, Object>();
// 如果父级是0
if (x.getPid() == "0") {
mapArr.put("id", x.getId());
mapArr.put("name", x.getName());
mapArr.put("pid", x.getPid());
mapArr.put("childList", menuChild(x.getId()));
list.add(mapArr);
}
}
}
/**
* 递归获取
* 组装id鱼id的子集
*
* @param id 父级
* @return id的子节点集
*/
private List<?> menuChild(String id) {
List<Object> lists = new ArrayList<Object>();
// 遍历全集,找pid=id的节点,也就是id的子节点
for (Tree a : menuCommon) {
Map<String, Object> childArray = new LinkedHashMap<String, Object>();
// id 的子节点 有子节点才会进入,不然就结束方法递归了
if (a.getPid() == id) {
childArray.put("id", a.getId());
childArray.put("name", a.getName());
childArray.put("pid", a.getPid());
// 组装id的字节点的时候,也组装该子节点的子节点集
childArray.put("childList", menuChild(a.getId()));
lists.add(childArray);
}
}
// id的子节点对象集
return lists;
}
}
@Test
public void methodNameTest() {
List<Tree> data = new ArrayList<Tree>();
// 获取节点数据
Tree tree = new Tree();
tree.setId("1");
tree.setPid("0");
tree.setName("系统管理");
data.add(tree);
tree = new Tree();
tree.setId("2");
tree.setPid("1");
tree.setName("管理员列表");
data.add(tree);
tree = new Tree();
tree.setId("3");
tree.setPid("2");
tree.setName("新增管理员");
data.add(tree);
tree = new Tree();
tree.setPid("0");
tree.setId("4");
tree.setName("导览管理");
data.add(tree);
tree = new Tree();
tree.setId("5");
tree.setPid("4");
tree.setName("POI管理");
data.add(tree);
System.out.println(data.toString());
// 菜单树
List<Object> list = new MenuTree(data).getList();
// System.out.println(list.toString());
// 将集合转换为JSON数组
System.out.println(JSONArray.toJSON(list));
}