menu.java
package com.unis.demo.entity;
import java.util.List;
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方法
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getIcon() {
return icon;
}
public void setIcon(String icon) {
this.icon = icon;
}
public int getOrder() {
return order;
}
public void setOrder(int order) {
this.order = order;
}
public List<Menu> getChildren() {
return children;
}
public void setChildren(List<Menu> children) {
this.children = children;
}
@Override
public String toString() {
return "Menu [id=" + id + ", name=" + name + ", parentId=" + parentId + ", url=" + url + ", icon=" + icon
+ ", order=" + order + ", children=" + children + "]";
}
}
menuService.java
package com.unis.demo.service;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.unis.demo.entity.Menu;
public class MenuService {
/**
* 生成树
*
* @return
*/
public static Map<String, Object> findTree() {
Map<String, Object> data = new HashMap<String, Object>();
try {// 查询所有菜单
// List<Menu> allMenu = menuDao.findTree();
List<Menu> allMenu=new ArrayList<Menu>();
Menu menu=new Menu();
menu.setParentId("0");
menu.setId("1");
menu.setName("中國");
menu.setOrder(1);
Menu menu2=new Menu();
menu2.setParentId("0");
menu2.setId("3");
menu2.setName("美國");
menu2.setOrder(2);
Menu menu1=new Menu();
menu1.setParentId("1");
menu1.setId("101");
menu1.setName("陝西");
menu.setOrder(3);
allMenu.add(menu);
allMenu.add(menu1);
allMenu.add(menu2);
// 根节点
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);
System.out.println(data);
return data;
} catch (Exception e) {
data.put("success", "false");
data.put("list", new ArrayList());
return data;
}
}
/**
* 获取子节点
*
* @param id
* 父节点id
* @param allMenu
* 所有菜单列表
* @return 每个根节点下,所有子菜单列表
*/
public static List<Menu> getChild(String id, List<Menu> allMenu) {
// 子菜单
List<Menu> childList = new ArrayList<Menu>();
for (Menu nav : allMenu) {
// 遍历所有节点,将所有菜单的父id与传过来的根节点的id比较
// 相等说明:为该根节点的子节点。
if (nav.getParentId().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;
}
/*
* 排序,根据order排序
*/
public static 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;
}
public static void main(String[] args) {
findTree();
}
}
子菜单不断递归parentid为自己的。从而setChild