`

使用递归输出树形菜单

    博客分类:
  • java
阅读更多
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 树形菜单demo
 * @author Jason
 * @date 
 */
public class TreeMain {

	private List<Menu> menus;  

	public TreeMain() {
		menus = new ArrayList<Menu>();
		Menu menu = new Menu();
		menu.setId("1");
		menu.setName("一级菜单A");
		menu.setParentId(null);
		menus.add(menu);
		
		Menu menu2 = new Menu();
		menu2.setId("2");
		menu2.setName("一级菜单B");
		menu2.setParentId(null);
		menus.add(menu2);
		
		Menu menu3 = new Menu();
		menu3.setId("3");
		menu3.setName("一级菜单C");
		menu3.setParentId(null);
		menus.add(menu3);
		
		Menu menu4 = new Menu();
		menu4.setId("4");
		menu4.setName("一级菜单A__1");
		menu4.setParentId("1");
		menus.add(menu4);
		
		Menu menu5 = new Menu();
		menu5.setId("5");
		menu5.setName("一级菜单A__2");
		menu5.setParentId("1");
		menus.add(menu5);
		
		Menu menu6 = new Menu();
		menu6.setId("6");
		menu6.setName("二级菜单A__1");
		menu6.setParentId("2");
		menus.add(menu6);
		
		Menu menu7 = new Menu();
		menu7.setId("7");
		menu7.setName("二级菜单A__2");
		menu7.setParentId("2");
		menus.add(menu7);
		
		Menu menu8 = new Menu();
		menu8.setId("8");
		menu8.setName("二级菜单A__3");
		menu8.setParentId("2");
		menus.add(menu7);
	}
	
	
	public static void main(String[] args) {
		TreeMain main = new TreeMain();
		main.buildTree();
	}
	
	
      
    public void buildTree(){  
    	Map<Menu, List<Menu>> menuMap = new HashMap<Menu, List<Menu>>();
        for (Menu menu : menus) {  
            if (menu.getParentId() == null) {  
            	List<Menu> menuList = build(menu);  
            	menuMap.put(menu, menuList);
            }  
        }  
        
        for (Map.Entry<Menu, List<Menu>> entry : menuMap.entrySet()) {  
 			System.out.println("=="+entry.getKey().getName());
 			for(Menu menu :entry.getValue()) {
 				System.out.println("----"+menu.getName());
 			}
        } 
    }  
    
    /**
     * 递归遍历菜单
     * @param menu
     * @return
     */
    private List<Menu> build(Menu menu){  
    	List<Menu> menuList = new ArrayList<Menu>();
        List<Menu> children = getChildren(menu);  
        if (!children.isEmpty()) {  
            for (Menu child : children) {  
            	//String id = child.getId();  
            	menuList.add(child);
                //build(child);  
            }  
        } 
        return menuList;
    }  
      
    private List<Menu> getChildren(Menu menu){  
        List<Menu> children = new ArrayList<Menu>();  
        String id = menu.getId();  
        for (Menu child : menus) {  
            if (id.equals(child.getParentId())) { //获取子菜单
                children.add(child);  
            }  
        }  
        return children;  
    }  
}

 输出结果:

==一级菜单A
----一级菜单A__1
----一级菜单A__2
==一级菜单B
----二级菜单A__1
----二级菜单A__2
----二级菜单A__2
==一级菜单C

 

 

分享到:
评论

相关推荐

    Java递归如何正确输出树形菜单

    主要为大家详细介绍了Java递归如何正确输出树形菜单,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    huzy123#knowledge-doc#多级菜单递归遍历成树1

    多级菜单递归遍历成树实现//获取全部page//递归输出outpage(页面菜单)//一级菜单 0 null//为一级菜单设置子菜单//递归调用//子菜单//遍

    二叉排序树与平衡二叉树的实现

    平衡二叉排序树的在平衡因子绝对值等于2时开始调整到绝对值为1或0,在平衡因子绝对值为2时,二叉排序树会出现四种不同的情况的树形,因此这时需要分别单独讨论来降低平衡因子。 1.2.7 平衡二叉树的调整方法  平衡...

    200个经典C程序源码小游戏

    163 彩色弹出菜单 164 读取CMOS信息 165 获取BIOS设备列表 166 锁住硬盘 167 备份/恢复硬盘分区表 168 设计口令程序 169 程序自我保护 第六部分 常见试题解答篇 170 水果拼盘 171 小孩吃...

    用c描述的数据结构演示软件

    在算法选择菜单画面中,形如 的图标意为尚有下级菜单,形如 的图标则表示将直接进入算法演示状态。此时也可直接单击一级菜单或二级菜单的标题直接返回之,注意:菜单右侧上方的“退出”按钮意为退出整个演示课件。 2...

    数据结构演示软件

    在算法选择菜单画面中,形如 的图标意为尚有下级菜单,形如 的图标则表示将直接进入算法演示状态。此时也可直接单击一级菜单或二级菜单的标题直接返回之,注意:菜单右侧上方的“退出”按钮意为退出整个演示课件。 ...

    WinRAR 3.90 破解版

    c) F5 键刷新树形窗格中的内容; d) Del 键删除在文件夹树中选定的文件夹. 5. 如果你希望在 WinRAR 外壳文件列表中看到文件日期中的秒钟, 你可以在“设置/文件 列表”对话框启用“显示秒钟”选项. 6. 在...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    *3.4.2 在输入流与输出流中使用控制符 3.4.3 用getchar和putchar函数进行字符的输入和输出 3.4.4 用scanf和printf函数进行输入和输出 3.5 编写顺序结构的程序 3.6 关系运算和逻辑运算 3.6.1 关系运算和关系表达式 ...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    *3.4.2 在输入流与输出流中使用控制符 3.4.3 用getchar和putchar函数进行字符的输入和输出 3.4.4 用scanf和printf函数进行输入和输出 3.5 编写顺序结构的程序 3.6 关系运算和逻辑运算 3.6.1 关系运算和关系表达式 ...

    Linux高级bash编程

    使用 cpio 来拷贝一个目录树 12-28. 解包一个 rpm 归档文件 12-29. 从 C 文件中去掉注释 12-30. Exploring /usr/X11R6/bin 12-31. 一个"改进过"的 strings 命令 12-32. 在一个脚本中使用 cmp 来比较2个文件. 12-33...

    Advanced Bash-Scripting Guide <>

    使用 cpio 来拷贝一个目录树 12-28. 解包一个 rpm 归档文件 12-29. 从 C 文件中去掉注释 12-30. Exploring /usr/X11R6/bin 12-31. 一个"改进过"的 strings 命令 12-32. 在一个脚本中使用 cmp 来比较2 个文件. 12-33...

    200个经典C程序【源码】

    163 彩色弹出菜单 164 读取CMOS信息 165 获取BIOS设备列表 166 锁住硬盘 167 备份/恢复硬盘分区表 168 设计口令程序 169 程序自我保护 第六部分 常见试题解答篇 170 水果拼盘 171 小孩吃梨 172 删除字符...

    WinRar 9.0 破解版

    c) F5 键刷新树形窗格中的内容; d) Del 键删除在文件夹树中选定的文件夹。 5. 如果你希望在 WinRAR 外壳文件列表中看到文件日期中的秒钟, 你可以在“设置/文件列表”对话框启用“显示秒钟”选项。 6. 在“设置/...

    winrar3.9破解

    c) F5 键刷新树形窗格中的内容; d) Del 键删除在文件夹树中选定的文件夹。 5. 如果你希望在 WinRAR 外壳文件列表中看到文件日期中的秒钟, 你可以在”设置/文件列表”对话框启用”显示秒钟”选项。 6. 在”设置/综合/...

    UbuntuChina12

    4.1.1 树形层次结构 87 4.1.2 路径名 88 4.2 文件系统的组织结构 88 4.3 文件的类型 92 4.3.1 普通文件 92 4.3.2 目录文件 94 4.3.3 特殊文件 95 4.3.4 链接文件 98 4.3.5 符号链接文件 99 4.3.6 管道文件 101 4.4 ...

Global site tag (gtag.js) - Google Analytics