java递归生成树形结构菜单

一、mysql表,数据自行准备

CREATE TABLE `sys_menu` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `pid` bigint(20) DEFAULT NULL,
  `title` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
  `path` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
  `level` int(11) DEFAULT NULL,
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=200 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

二、创建对应的实体类

public class Menu implements Serializable {
	
	private static final long serialVersionUID = -5990021029947688358L;
	
	private Integer id;
	private String title;//菜单标题
	private String path;//路径
	private Integer pid;//父菜单ID 一级菜单pid为null
	private Integer level;//级别,排序用
	
	private List<Menu> children = new ArrayList<Menu>();

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getPath() {
		return path;
	}

	public void setPath(String path) {
		this.path = path;
	}

	public Integer getPid() {
		return pid;
	}

	public void setPid(Integer pid) {
		this.pid = pid;
	}

	public Integer getLevel() {
		return level;
	}

	public void setLevel(Integer level) {
		this.level = level;
	}

	public List<Menu> getChildren() {
		return children;
	}

	public void setChildren(List<Menu> children) {
		this.children = children;
	}
}

三、递归组装树形结构函数实现

        /**
         * @方法名: parseMenuTree<br>
         * @描述: 组装菜单<br>
         * @param list 数据库里面获取到的全量菜单列表
         * @return
         */
        public static List<Menu> parseMenuTree(List<Menu> list){
	    List<Menu> result = new ArrayList<Menu>();
		
	    // 1、获取第一级节点
	    for (Menu menu : list) {
	        if(null == menu.getPid()) {
		    result.add(menu);
		}	
	    }
		
	    // 2、递归获取子节点
	    for (Menu parent : result) {
		parent = recursiveTree(parent, list);
	    }
		
	    return result;
	}
	
	public static Menu recursiveTree(Menu parent, List<Menu> list) {
	    for (Menu menu : list) {
	        if(Objects.equals(parent.getId(),menu.getPid())) {
		    menu = recursiveTree(menu, list);
		    parent.getChildren().add(menu);
		}
	    }
		    
	    return parent;
	}

四、从数据库获取菜单数据,调用组装菜单函数生成树形结构的数据

        public static void main(String[] args) {
		
		List<Menu> list = new ArrayList<Menu>();
		//TODO 这里从数据库获取全量菜单后放到list中
		
		//树形结构数据生成
		List<Menu> result = parseMenuTree(list);
		
		System.out.println(JSONObject.toJSONString(result));
	}

 

评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值