概述
在项目开发中我们经常会遇到各种树形菜单显示,尤其是菜单显示、机构部门等等。下面就简单介绍几步就能完成一个树形菜单的接口
首先构建树形结构,我们得知道什么是树形结构,如下图所示。

上图就是树形结构
而我们在Java后台利用递归思路进行构建树形结构数据,返回给前端,能以下拉菜单等形式进行展示。
废话不多说,直接上代码。
为了简化代码,可引入Lombok的Jar包,可省略实体类get()/set()方法。
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.12</version> </dependency>
|
树节点实体类
import lombok.Getter; import lombok.Setter; import java.util.List; @Data public class TreeNode { private Integer id; private Integer parentId; private String label; private List<TreeNode> children; public TreeNode(Integer id, Integer parentId, String label) { this.id = id; this.parentId = parentId; this.label = label; } }
|
构建树形类
理解思路(个人):
1、首先获取所有的根节点(顶级节点),即根节点的parentId = 0。
2、根据每一个根节点,与所有节点集合(数据)进行判断,当前节点是否为其下的子节点。
3、 如果是,则递归调用构建树形;如果不是,则表明该节点不属于其下子节点。
4、应继续循环判断节点父子关系,直到所有节点与根节点判断完毕。
import java.util.ArrayList; import java.util.List; public class TreeBuild { public List<TreeNode> nodeList = new ArrayList<>();
public TreeBuild(List<TreeNode> nodeList){ this.nodeList = nodeList; }
public List<TreeNode> getRootNode(){ List<TreeNode> rootNodeList = new ArrayList<>(); for (TreeNode treeNode : nodeList){ if (0 == treeNode.getParentId()) { rootNodeList.add(treeNode); } } return rootNodeList; }
public List<TreeNode> buildTree(){ List<TreeNode> treeNodes = new ArrayList<TreeNode>(); for (TreeNode treeRootNode : getRootNode()) { treeRootNode = buildChildTree(treeRootNode); treeNodes.add(treeRootNode); } return treeNodes; }
public TreeNode buildChildTree(TreeNode pNode){ List<TreeNode> childTree = new ArrayList<TreeNode>(); for (TreeNode treeNode : nodeList) { if (treeNode.getParentId().equals(pNode.getId())) { childTree.add(buildChildTree(treeNode)); } } pNode.setChildren(childTree); return pNode; } }
|
测试案例
import com.lbf.common.core.domain.AjaxResult; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.ArrayList; import java.util.List;
@RestController @RequestMapping("/tree") public class TreeController { @GetMapping("/treeTest") public AjaxResult treeTest(){ List<TreeNode> treeNodeList = new ArrayList<>(); treeNodeList.add(new TreeNode(1,0,"顶级节点A")); treeNodeList.add(new TreeNode(2,0,"顶级节点B")); treeNodeList.add(new TreeNode(3,1,"父节点是A")); treeNodeList.add(new TreeNode(4,2,"父节点是B")); treeNodeList.add(new TreeNode(5,2,"父节点是B")); treeNodeList.add(new TreeNode(6,3,"父节点的ID是3")); TreeBuild treeBuild = new TreeBuild(treeNodeList); treeNodeList = treeBuild.buildTree(); return AjaxResult.success("测试数据",treeNodeList); } }
|
测试结果
