Java树形菜单的构建、遍历以及获取树形菜单的Id集合List

本文介绍了一种树形菜单构建及遍历的方法,包括创建Menu类与MenuDTO类来存储菜单信息,并通过递归函数实现树形结构的遍历以获取所有节点ID。

项目的开发过程中经常遇到树形菜单构建,遍历的情况,于是记录一下以便查阅。
1创建一个Menu类,简单起见,这里我只使用了id和pid的字段

package com.huato.tree.menu;

import java.io.Serializable;

public class Menu  implements Serializable {

    private static final long serialVersionUID = 1L;

    private Integer id;

    private Integer pid;

    public Integer getId() {
        return id;
    }

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

    public Integer getPid() {
        return pid;
    }

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

}

2创建一个MenuDTO类

package com.huato.tree.menu;

import java.io.Serializable;
import java.util.List;

public class MenuDTO extends Menu implements Serializable {

    private static final long serialVersionUID = 1L;

    private List<MenuDTO> children;

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

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


}

3RunMain方法测试

package com.huato.tree.menu;

import java.util.ArrayList;
import java.util.List;
/**
 * 遍历树形菜单
 * @author dengyu 
 */                      
public class RunMain {

    //构造成MenuDTO数据结构
    public static List<MenuDTO> getAllMenu(List<Menu> list) {
        List<MenuDTO> result = new ArrayList<>();
        for (Menu item : list) {
            MenuDTO menuDTO = new MenuDTO();
            menuDTO.setId(item.getId());
            menuDTO.setPid(item.getPid());
            menuDTO.setChildren(null);
            result.add(menuDTO);
        }
        return result;
    }
    /**
     * 作用:遍历树形菜单得到所有的id
     * @param root  
     * @param result
     * @return
     */
    //前序遍历得到所有的id List
    private static List<Integer> ergodicList(List<MenuDTO> root, List<Integer> result){
         for (int i = 0; i < root.size(); i++) {
                // 查询某节点的子节点(获取的是list)
                result.add(root.get(i).getId());//前序遍历
                if (null != root.get(i).getChildren()) {
                    List<MenuDTO> children = root.get(i).getChildren();
                    ergodicList(children,result);
                }
                //result.add(root.get(i).getId());//后序遍历
        }
        return result;
     }


    public static  List<MenuDTO> ergodicTrees(List<MenuDTO> root) throws Exception {
        for (int i = 0; i < root.size(); i++) {
            // 查询某节点的子节点(获取的是list)
            List<MenuDTO> children = new ArrayList<MenuDTO>();
            if (null != root.get(i).getChildren()) {
                children = root.get(i).getChildren();
            }
            ergodicTrees(children);
        }
        return root;
    }
    /**
     * 
     * @param list  MenuDTO数据
     * @param pid  父id
     * @return 把所有list  MenuDTO设置子节点
     * @throws Exception
     */
    public static List<MenuDTO> treeMenu(List<MenuDTO> list,Integer pid) throws Exception{
        List<MenuDTO> childList = new ArrayList<MenuDTO>();
        for (MenuDTO item : list) {
            if (item != null) {
                // 判断当前节点的父节点是否是pid
                if (pid.equals(item.getPid())) {
                    List<MenuDTO> child = treeMenu(list, item.getId());
                    item.setChildren(child);
                    childList.add(item);
                }
            }
        }
        return ergodicTrees(childList);
    }

    public static void main(String[] args) throws Exception {
        List<Menu> menus = new ArrayList<>();
        Menu menu1 = new Menu();
        menu1.setId(1);
        menu1.setPid(0);
        Menu menu2 = new Menu();
        menu2.setId(2);
        menu2.setPid(1);
        Menu menu3 = new Menu();
        menu3.setId(3);
        menu3.setPid(1);
        Menu menu4 = new Menu();
        menu4.setId(4);
        menu4.setPid(3);
        Menu menu5 = new Menu();
        menu5.setId(5);
        menu5.setPid(0);
        Menu menu6 = new Menu();
        menu6.setId(6);
        menu6.setPid(5);
        Menu menu7 = new Menu();
        menu7.setId(7);
        menu7.setPid(5);
        menus.add(menu1);
        menus.add(menu2);
        menus.add(menu3);
        menus.add(menu4);
        menus.add(menu5);
        menus.add(menu6);
        menus.add(menu7);
        List<MenuDTO> menuDTOs = getAllMenu(menus);
        List<MenuDTO> root = treeMenu(menuDTOs,0) ;  //pid=0
        //存放树形Integer类型的结果集
        List<Integer> result = new ArrayList<>();
        ergodicList(root,result);
        for (Integer item : result) {
            System.out.print(item +" ");  //前序遍历 1 2 3 4 5 6 7
        }
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值