简单几步,快速实现封装多级树结构对象(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();