思路:
- TreeNode实体类设计:id,parentId,name,List<TreeNode>
- 组装树形结构思路:
- 将DB中查询的数据List放到map中,方便查找
- 根据id和parentId组装数据
树节点:
package org.entity;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* ClassName: TreeNode
*
* @description: 树节点
* @author: LYJ
* @Create: 2024/11/6 14:27
* @Version: 1.0
* @return
*/
public class TreeNode {
private Long id;//树节点id
private String name;
private Long parentId;//父节点id
private List<TreeNode> children=new ArrayList<>();//孩子节点
/*
set/get/无参/有参构造方法/oString
*/
}
菜单实体:
package org.entity;
import java.util.Objects;
/**
* ClassName: Menu
*
* @description:菜单实体
* @author: LYJ
* @Create: 2024/11/6 14:32
* @Version: 1.0
* @return
*/
public class Menu {
private Long id;
private String name;
private Long parentId;
/**set/get/无参/有参构造方法/oString **/
}
组装树形结构:
package org.entity;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* ClassName: TestTreeNode
*
* @description:
* @author: LYJ
* @Create: 2024/11/6 14:29
* @Version: 1.0
* @return
*/
public class TestTreeNode {
public static void main(String[] args) {
//从DB中查询的list数据,这里虚拟数据
ArrayList<Menu> list = new ArrayList<>();
// 添加测试数据
list.add(new Menu(1L, "Root1", null));
list.add(new Menu(2L, "Child1 of Root1", 1L));
list.add(new Menu(3L, "Child2 of Root1", 1L));
list.add(new Menu(4L, "Root2", null));
list.add(new Menu(5L, "Child1 of Root2", 4L));
list.add(new Menu(6L, "Child2 of Root2", 4L));
list.add(new Menu(7L, "Child of Child1", 2L));
Map<Long, TreeNode> map = new HashMap<>();
//将查询的数据放到map中,方便查找元素
for (Menu menu : list) {
TreeNode treeNode = new TreeNode();
treeNode.setId(menu.getId());
treeNode.setName(menu.getName());
treeNode.setParentId(menu.getParentId());
map.put(menu.getId(), treeNode);
}
//组装树形结构
List<TreeNode> treeNode = new ArrayList<>();
for (Menu menu : list) {
Long parentId = menu.getParentId();//父级id
Long NodeId = menu.getId();//该节点id
TreeNode treeNodeTemp = map.get(NodeId);//该节点对象
if(parentId==null){//父级
treeNode.add(treeNodeTemp);
}else {//孩子 //找到父级,在父级挂上孩子
TreeNode parentNode = map.get(parentId);//父节点
if(parentNode!=null){
parentNode.getChildren().add(treeNodeTemp);
}else {
System.out.println("父节点已经被删除了");
}
}
}
System.out.println("treeNode = " + treeNode);
}
}
效果: