当前位置:网站首页>递归菜单查询(递归:自己查自己)
递归菜单查询(递归:自己查自己)
2022-07-25 15:43:00 【Leon_Jinhai_Sun】
(1)level为1就是1级,children就是这一级的子菜单
(2)现有数据才能递归
(3)递归需要有入口,即从哪里开始查起
具体实现:
(1)递归的查询:
完整代码如下(解析在下面)
//========================递归查询所有菜单===========
//获取全部菜单
@Override
public List<Permission> queryAllMenuGuli() {
//1 查询菜单表所有数据
QueryWrapper<Permission> wrapper = new QueryWrapper<>();
wrapper.orderByDesc("id");
List<Permission> permissionList = baseMapper.selectList(wrapper);
//2 把查询所有菜单list集合按照要求进行封装
List<Permission> resultList = bulidPermission(permissionList);
return resultList;
}
//把返回所有菜单list集合进行封装的方法
public static List<Permission> bulidPermission(List<Permission> permissionList) {
//创建list集合,用于数据最终封装
List<Permission> finalNode = new ArrayList<>();
//把所有菜单list集合遍历,得到顶层菜单 pid=0菜单,设置level是1
for(Permission permissionNode : permissionList) {
//得到顶层菜单 pid=0菜单
if("0".equals(permissionNode.getPid())) {
//设置顶层菜单的level是1
permissionNode.setLevel(1);
//根据顶层菜单,向里面进行查询子菜单,封装到finalNode里面
//permissionNode这个是level为1的所有数据
finalNode.add(selectChildren(permissionNode,permissionList));
}
}
return finalNode;
}
//这个是查询二级和三级菜单:
private static Permission selectChildren(Permission permissionNode, List<Permission> permissionList) {
//1 因为向一层菜单里面放二层菜单,二层里面还要放三层,把对象初始化
permissionNode.setChildren(new ArrayList<Permission>());
//2 遍历所有菜单list集合,进行判断比较,比较id和pid值是否相同
for(Permission it : permissionList) {
//判断 id和pid值是否相同
if(permissionNode.getId().equals(it.getPid())) {
//把父菜单的level值+1
int level = permissionNode.getLevel()+1;
it.setLevel(level);
//如果children为空,进行初始化操作
if(permissionNode.getChildren() == null) {
permissionNode.setChildren(new ArrayList<Permission>());
}
//把查询出来的子菜单放到父菜单里面
permissionNode.getChildren().add(selectChildren(it,permissionList));
}
}
return permissionNode;
} //========================递归查询所有菜单
先获取全部菜单,然后再进行查询
@Override
public List<Permission> queryAllMenuGuli() {
//1 查询菜单表所有数据
QueryWrapper<Permission> wrapper = new QueryWrapper<>();
wrapper.orderByDesc("id");
List<Permission> 所有内容(未封装) = baseMapper.selectList(wrapper);
//2 把查询所有菜单list集合按照要求进行封装
List<Permission> resultList = bulidPermission(所有内容(未封装));
return resultList;
}
//把返回所有菜单list集合进行封装的方法
public static List<Permission> bulidPermission(List<Permission> permissionList【所有内容(未封装)】) {
//创建list集合,用于数据最终封装
List<Permission> finalNode 【所有内容(已封装)】= new ArrayList<>();
//把所有菜单list集合遍历,得到顶层菜单 pid=0菜单,设置level是1
for(Permission permissionNode【一级菜单】 : permissionList) {
//得到顶层菜单 pid=0菜单
if("0".equals(permissionNode.getPid())) {
//设置顶层菜单的level是1
permissionNode.setLevel(1);
//根据顶层菜单,向里面进行查询子菜单,封装到finalNode里面
//permissionNode这个是level为1的所有数据
finalNode所有内容(已封装).add(selectChildren(新建的方法)(permissionNode【一级菜单】,permissionList【所有内容(未封装)】));--这是要准备进行递归了
}
}
return finalNode;
}
//这个是查询二级和三级菜单:
private static Permission selectChildren(permissionNode【一级菜单】,permissionList【所有内容(未封装)】) {
//1 因为向一层菜单里面放二层菜单,二层里面还要放三层,把对象初始化
permissionNode.setChildren(new ArrayList<Permission>());
//2 遍历所有菜单list集合,进行判断比较,比较id和pid值是否相同
for(Permission it【二菜单的内容】 : permissionList【所有内容(未封装)】) {
//判断 id和pid值是否相同
if(permissionNode【一级菜单】.getId().equals(it【二菜单的内容】.getPid())) {
//把父菜单的level值+1
int level = permissionNode.getLevel()+1;
it.setLevel(level);
//如果children为空,进行初始化操作
if(permissionNode.getChildren() == null) {
permissionNode.setChildren(new ArrayList<Permission>());
}--锦上添花,没有也可以
//把查询出来的子菜单放到父菜单里面
permissionNode【一级菜单】.getChildren().add(selectChildren(it【二菜单的内容】,permissionList【所有内容(未封装)】));--接下来就是循环上面的步骤
}
}
return permissionNode【一级菜单】;
}
边栏推荐
- July 25th, 2022 Daily: Microsoft proposed CodeT: a new SOTA for code generation, with 20 points of performance improvement
- Understand "average load"
- Gary marcus: learning a language is more difficult than you think
- R语言ggplot2可视化线图(line)、自定义配置标题文本相关内容颜色和图例(legend)颜色相匹配(和分组线图的颜色相匹配、match colors of groups)
- Leetcode - 232 realize queue with stack (design double stack to realize queue)
- TypeError: Unrecognized value type: <class ‘str‘> ParserError: Unknown string format
- Is there only one lib under JDBC in Seata?
- Leetcode - 707 design linked list (Design)
- 产品动态丨Android 13 高效适配全新升级
- Why is preparestatement better and safer?
猜你喜欢

Use cpolar to build a business website (how to buy a domain name)

产品动态丨Android 13 高效适配全新升级

基于Caffe ResNet-50网络实现图片分类(仅推理)的实验复现

Matlab -- CVX optimization kit installation

Alibaba's internal "100 billion level concurrent system architecture design notes" are all inclusive, too comprehensive

华为2023届提前批预热开始!左 神的程序代码面试指南终派上用场

ML - Speech - Introduction to speech processing

如何构建面向海量数据、高实时要求的企业级OLAP数据引擎?

今天睡眠质量记录84分

Idea - click the file code to automatically synchronize with the directory
随机推荐
Implementation of recommendation system collaborative filtering in spark
MySQL—常用SQL语句整理总结
MySQL教程66-数据表查询语句
Endnote add Chinese gbt7714 style how to quote documents in word
TypeError: Unrecognized value type: <class ‘str‘> ParserError: Unknown string format
HDD Hangzhou station · harmonyos technical experts share the features of Huawei deveco studio
电阻电路的等效变化(Ⅱ)
R语言偏相关性计算(Partial Correlation)、使用ggm包的pcor函数计算偏相关性(Partial Correlations)
MySQL—用户和权限管控
"Digital security" alert NFT's seven Scams
活动回顾|7月6日安远AI x 机器之心系列讲座第2期|麻省理工教授Max Tegmark分享「人类与AI的共生演化 」
30 lines write the concurrency tool class yourself (semaphore, cyclicbarrier, countdownlatch)
通用测试用例写作规范
MySQL 元数据锁(MDL)
LeetCode - 362 敲击计数器(设计)
产品动态丨Android 13 高效适配全新升级
MATLAB optimization tool manopt installation
< stack simulation recursion >
ML - Speech - Introduction to speech processing
Icpc2021 Kunming m-violence + chairman tree