通过 递归 实现 Java 后端返回结果树形结构化
1:实体类
@Data
@ApiModel(value = "部门树 VO封装", description = "VO封装")
public class DeptTreeVO {
/**
* 部门编号
*/
@ApiModelProperty(value = "部门编号", dataType = "String")
private String deptNo;
/**
* 部门名称
*/
@ApiModelProperty(value = "部门名称")
private String deptName;
/**
* 父级部门编号
*/
@ApiModelProperty(value = "父级部门编号", dataType = "String")
private String pDeptNo;
/**
* 部门子集
*/
@ApiModelProperty(value = "部门子集")
private List<DeptTreeVO> children;
2:关键 impl代码
@Override
public List<DeptTreeVO> buildDeptTreeSelect() {
//后端返回的List集合数据
List<DeptTreeVO> deptTreeVOList = commonDAO.selectAllDeptVO();
//重新创建了一个ArrayList 集合
List<DeptTreeVO> returnList = new ArrayList<DeptTreeVO>();
//存放部门编号所需要的一个新的集合
List<String> tempList = new ArrayList<String>();
for (DeptTreeVO dept : deptTreeVOList) {
//将部门编号赋值到 tempList 这个集合中
tempList.add(dept.getDeptNo());
}
// Iterator<DeptTreeVO> iterator1 = deptTreeVOList.iterator();
// boolean b = iterator1.hasNext();
// DeptTreeVO dept = iterator1.next(); 等同于·下面 for循环中的条件
//
//使用迭代器判断里面是否存在数据
for (Iterator<DeptTreeVO> iterator = deptTreeVOList.iterator(); iterator.hasNext(); ) {
DeptTreeVO dept = iterator.next();
// 判断遍历出来的数据是是否 不 包含 父级部门编号
if (!tempList.contains(dept.getPDeptNo())) {
// 递归 第一个参数是查询出来: 所有的数据集合, 第二个参数数据是: 集合中的单条数据
recursionFn(deptTreeVOList, dept);
//返回数据
returnList.add(dept);
}
// TreeUtil.build();
}
if (returnList.isEmpty()) {
returnList = deptTreeVOList;
}
return returnList;
}
/**
* 递归列表
*/
private void recursionFn(List<DeptTreeVO> list, DeptTreeVO t) {
// 得到子节点列表 中所有的 数据
List<DeptTreeVO> childList = getChildList(list, t);
//等到得到子节点的 数据中。。。。。。。。。。。。。。。。。。。。。
//将得到的子节点数据赋值给DeptTreeVo private List<DeptTreeVO> children;
t.setChildren(childList);
//再遍历 得到的子节点数据 判断子节点是否还有子节点
for (DeptTreeVO tChild : childList) {
//如果子节点中的数据 依然拥有子节点
if (hasChild(list, tChild)) {
// 递归 如果有有数据,每条数据下的子节点一直递归调用本方法
recursionFn(list, tChild);
}
}
}
/**
* 得到子节点列表
*/
private List<DeptTreeVO> getChildList(List<DeptTreeVO> list, DeptTreeVO t) {
//创建一个集合
List<DeptTreeVO> tlist = new ArrayList<DeptTreeVO>();
//迭代器 遍历所有数据集合的数据
Iterator<DeptTreeVO> it = list.iterator();
while (it.hasNext()) {
//拿到每一条数据
DeptTreeVO n = (DeptTreeVO) it.next();
//如果 子节点列表中的 父部门编号 不是空数据 并且 子节点列表中的父部门编号 == 所有部门编号 中的其中一个部门编号
if (StringUtils.isNotBlank(n.getPDeptNo()) && n.getPDeptNo().equals(t.getDeptNo())) {
//将对应的 数据 存放到tlist 集合中,并返回出去 (拥有子节点的树形结构)
tlist.add(n);
}
}
return tlist;
}
/**
* 判断是否有子节点
*/
private boolean hasChild(List<DeptTreeVO> list, DeptTreeVO t) {
return getChildList(list, t).size() > 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示