生成菜单树示例

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值