简单几步,快速实现封装多级树结构对象(Java版)

简单几步,快速实现封装多级树结构对象(Java版)

记录

在Java后台利用递归思路进行构建树形结构数据,返回给前端,能以下拉菜单等形式进行展示。

为了简化代码,引入Lombok的Jar包,可省略实体类set()、get()方法。

<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.12</version> </dependency>

一、树节点数据类

importlombok.Getter; importlombok.Setter; importjava.util.List; *TreeNode树节点(定义每一个节点的信息,即每一个节点对应一条数据信息) *@authorLBF *@date2022/1/1016:46 @Setter @Getter publicclassTreeNode{ /**节点ID*/ privateIntegerid; /**父节点ID:顶级节点为0*/ privateIntegerparentId; /**节点名称*/ privateStringlabel; /**子节点*/ privateList<TreeNode>children; publicTreeNode(Integerid,IntegerparentId,Stringlabel){ this.id=id; this.parentId=parentId; this.label=label;

二、构建树形类

理解思路(个人):

1、首先获取所有的根节点(顶级节点),即根节点的parentId = 0。

2、根据每一个根节点,与所有节点集合(数据)进行判断,当前节点是否为其下的子节点。

3、若是,则递归调用构建树形;若不是,则表明该节点不属于其下子节点。

4、应继续循环判断节点父子关系,直到所有节点与根节点判断完毕。另外,推荐公众 号Java精选,回复java面试,获取在线面试资料,支持随时随地刷题。

importjava.util.ArrayList; importjava.util.List; *BuildTree构建树形结构 *@authorLBF *@date2022/1/1017:06 publicclassTreeBuild{ //保存参与构建树形的所有数据(通常数据库查询结果) publicList<TreeNode>nodeList=newArrayList<>(); *构造方法 *@param nodeList 将数据集合赋值给nodeList,即所有数据作为所有节点。 publicTreeBuild(List<TreeNode>nodeList){ this.nodeList=nodeList; *获取需构建的所有根节点(顶级节点)"0" *@return所有根节点List集合 publicList<TreeNode>getRootNode(){ //保存所有根节点(所有根节点的数据) List<TreeNode>rootNodeList=newArrayList<>(); // treeNode:查询出的每一条数据(节点) for(TreeNodetreeNode:nodeList){ //判断当前节点是否为根节点,此处注意:若parentId类型是String,则要采用equals()方法判断。 if(0==treeNode.getParentId()){ //是,添加 rootNodeList.add(treeNode); returnrootNodeList; *根据每一个顶级节点(根节点)进行构建树形结构 *@return构建整棵树 publicList<TreeNode>buildTree(){ // treeNodes:保存一个顶级节点所构建出来的完整树形 List<TreeNode>treeNodes=newArrayList<TreeNode>(); // getRootNode():获取所有的根节点 for(TreeNodetreeRootNode:getRootNode()){ //将顶级节点进行构建子树 treeRootNode=buildChildTree(treeRootNode); //完成一个顶级节点所构建的树形,增加进来 treeNodes.add(treeRootNode); returntreeNodes; *递归-----构建子树形结构 *@parampNode根节点(顶级节点) *@return整棵树 publicTreeNodebuildChildTree(TreeNodepNode){ List<TreeNode>childTree=newArrayList<TreeNode>(); // nodeList:所有节点集合(所有数据) for(TreeNodetreeNode:nodeList){ //判断当前节点的父节点ID是否等于根节点的ID,即当前节点为其下的子节点 if(treeNode.getParentId().equals(pNode.getId())){ //再递归进行判断当前节点的情况,调用自身方法 childTree.add(buildChildTree(treeNode)); //for循环结束,即节点下没有任何节点,树形构建结束,设置树结果 pNode.setChildren(childTree); returnpNode;

三、测试案例

importcom.lbf.common.core.domain.AjaxResult; importorg.springframework.web.bind.annotation.GetMapping; importorg.springframework.web.bind.annotation.RequestMapping; importorg.springframework.web.bind.annotation.RestController; importjava.util.ArrayList; importjava.util.List; *TreeController树控制层 *方式:传递所有数据集合作为参数,调用buildTree()构建树形。 *@authorLBF *@date2022/1/1017:49 @RestController @RequestMapping("/tree") publicclassTreeController{ @GetMapping("/treeTest") publicAjaxResulttreeTest(){ //模拟测试数据(通常为数据库的查询结果) List<TreeNode>treeNodeList=newArrayList<>(); treeNodeList.add(newTreeNode(1,0,"顶级节点A")); treeNodeList.add(newTreeNode(2,0,"顶级节点B")); treeNodeList.add(newTreeNode(3,1,"父节点是A")); treeNodeList.add(newTreeNode(4,2,"父节点是B")); treeNodeList.add(newTreeNode(5,2,"父节点是B")); treeNodeList.add(newTreeNode(6,3,"父节点的ID是3")); //创建树形结构(数据集合作为参数) TreeBuildtreeBuild=newTreeBuild(treeNodeList); //原查询结果转换树形结构 treeNodeList=treeBuild.buildTree();