實體類
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"
: []
}
]
}