java实现多级递归
实体类
public
class
Menu {
// 菜单id
private
String id;
// 菜单名称
private
String name;
// 父菜单id
private
String parentId;
// 菜单url
private
String url;
// 菜单图标
private
String icon;
// 菜单顺序
private
int
order;
// 子菜单
private
List<Menu> children;
// ... 省去getter和setter方法以及toString方法
}
/*
* 排序,根据order排序
*/
public
Comparator<Menu> order(){
Comparator<Menu> comparator =
new
Comparator<Menu>() {
@Override
public
int
compare(Menu o1, Menu o2) {
if
(o1.getOrder() != o2.getOrder()){
return
o1.getOrder() - o2.getOrder();
}
return
0
;
}
};
return
comparator;
}
3.生成树的方法
public
Map<String,Object> findTree(){
Map<String,Object> data =
new
HashMap<String,Object>();
try
{
//查询所有菜单
List<Menu> allMenu = menuDao.findTree();
//根节点
List<Menu> rootMenu =
new
ArrayList<Menu>();
for
(Menu nav : allMenu) {
if
(nav.getParentId().equals(
"0"
)){
//父节点是0的,为根节点。
rootMenu.add(nav);
}
}
/* 根据Menu类的order排序 */
Collections.sort(rootMenu, order());
//为根菜单设置子菜单,getClild是递归调用的
for (Menu nav : rootMenu) {
/* 获取根节点下的所有子节点 使用getChild方法*/
List<Menu> childList = getChild(nav.getId(), allMenu);
nav.setChildren(childList);//给根节点设置子节点
}
/**
* 输出构建好的菜单数据。
*
*/
data.put(
"success"
,
"true"
);
data.put(
"list"
, rootMenu);
return
data;
}
catch
(Exception e) {
data.put(
"success"
,
"false"
);
data.put(
"list"
,
new
ArrayList());
return
data;
}
}
4.获取子菜单
/**
* 获取子节点
* @param id 父节点id
* @param allMenu 所有菜单列表
* @return 每个根节点下,所有子菜单列表
*/
public
List<Menu> getChild(String id,List<Menu> allMenu){
//子菜单
List<Menu> childList =
new
ArrayList<Menu>();
for
(Menu nav : allMenu) {
// 遍历所有节点,将所有菜单的父id与传过来的根节点的id比较
//相等说明:为该根节点的子节点。
if
(nav.ParentId().equals(id)){
childList.add(nav);
}
}
//递归
for
(Menu nav : childList) {
nav.setChildren(getChild(nav.getId(), allMenu));
}
Collections.sort(childList,order());
//排序
//如果节点下没有子节点,返回一个空List(递归退出)
if
(childList.size() ==
0
){
return
new
ArrayList<Menu>();
}
return
childList;
}
5.最终返回的json 字符串
{
"success"
:
"true"
,
"list"
: [
{
"id"
:
"1"
,
"name"
:
"Java"
,
"parentid"
:
"0"
,
"order"
:
1
,
"children"
: [
{
"id"
:
"2"
,
"name"
:
"并发编程"
,
"parentid"
:
"1"
,
"order"
:
1
,
"children"
: []
},
{
"id"
:
"3"
,
"name"
:
"多线程"
,
"parentid"
:
"1"
,
"order"
:
2
,
"children"
: [
"id"
:
"4"
,
"name"
:
"Thread"
,
"parentid"
:
"3"
,
"order"
:
1
,
"children"
:[]
]
}
]
},
{
"id"
:
"5"
,
"name"
:
"Python"
,
"parentid"
:
"0"
,
"order"
:
2
,
"children"
: []
}
]
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~