使用java 生成一个简单的菜单树--简单的都没有排序

第一步我们先看下树的节点数据结构

public class MenuTree implements Serializable {

    private String menuCode;
    /**
     * //菜单描述
     */
    private String name;
    /**
     * //菜单图标
     */
    private String icon;
    /**
     * //菜单指向的接口
     */
    private String path;
    /**
     * //菜单的序号
     */
    private Integer idx;
    /**
     * //菜单下的子菜单
     */
    private List<MenuTree> children;

    public void setIdx(Integer idx) {
        this.idx = idx;
    }

    public Integer getIdx() {
        return idx;
    }

    public void setMenuCode(String menuCode) {
        this.menuCode = menuCode;
    }

    public String getMenuCode() {
        return menuCode;
    }

    public String getName() {
        return name;
    }

    public String getIcon() {
        return icon;
    }

    public String getPath() {
        return path;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setIcon(String icon) {
        this.icon = icon;
    }

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

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

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

    public void addChildren(MenuTree node){
        this.children.add(node);
    }
}

第二步我们建立一个生成节点的方法

这个方法不是必要的,主要用来将数据转换成标准节点结构

private MenuTree buildNode(Menu menu){
        MenuTree node = new MenuTree();
        node.setMenuCode(menu.getMenuCode());
        node.setName(menu.getMeunName());
        node.setIcon(menu.getMenuIcon());
        node.setPath(menu.getMenuAddress());
        node.setChildren(new ArrayList<>());
        return node;
    }

第三步我们建立一个获取根节点的方法

一般来说我们多是基于一个数组或者列表来生成树的,而树的根也会在这个列表中

private MenuTree getRoot(List<Menu> menus, String rootId) {
        for (Iterator<Menu> it = menus.iterator(); it.hasNext(); ) {
            Menu iterator = it.next();
            if (iterator.getMenuCode().equals(rootId)) {
                //取得根节点信息后,就把根节点信息从 列表中删除
                menus.remove(iterator);
                return buildNode(iterator);
            }
        }
        return null;
    }

第四步就是我们的创建树的方法了

方法很简单,基于 迭代器和递归

 private MenuTree createMenuTree(List<Menu> menus, MenuTree parentNode) {
        //此处判断是为了 防止传入一个 空的根节点造成访问根节点信息
        //产生异常
        if (null != parentNode) {
            for (Iterator<Menu> it = menus.iterator(); it.hasNext(); ) {
                Menu iterator = it.next();
                if (parentNode.getMenuCode().equals(iterator.getParentCode())) {
                    //需要将此处符合的 信息从列表中删除,这样可以减少后来的 列表遍历次数
                    menus.remove(iterator);
                    MenuTree node = buildNode(iterator);
                    parentNode.addChildren(node);
                    //通过递归方式 在剩余的列表中 继续寻找子节点的 子节点
                    //递归返回的条件就是 在剩余的列表中没有 发现子节点
                    createMenuTree(menus, node);
                    //由于列表已改变需要 重新获取迭代器
                    it = menus.iterator();
                }
            }
        }
        return parentNode;
    }

----------------------------------------------这就是底线了--------------------------------------------------

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值