用递归获取多级菜单

获取多级菜单这件事情几乎在每个项目中都会遇到。以前的项目因为菜单只有两级并且不会添加深度,为了方便就直接手写两层循环把事情解决了。

后来维护的时候就觉得代码非常的啰嗦,而且因为循环里的东西太多,也不敢全部打开来修改,生怕把这堆本来就乱七八糟的程序彻底玩坏。

今年经历了一个项目,里面的多级菜单可以让用户自己添加深度,于是以前的代码就不适用了,虽然为了赶工硬着头皮写了五层循环把可能达到的深度问题给掩盖掉了,后来打开来看的时候自己也觉得不舒服,一来太长,重复的地方太多,而且虽然不可能,但是遇到用户误操作把深度加的更深的话连修改都做不到,因为显示不出来,于是决定趁着这几天东西比较少把这个历史遗留问题彻底解决。

其实思路很简单,把获取到的列表按照每个节点递归下去,逐渐把整个多叉树构建出来,但是具体的条件让我纠结了很久,也是暴露了基础能力的问题。


import java.util.List;

// 源数据
public class SourceDataPackage {
    public int status;
    public int reCount;
    public String Message;
    public List
   
   
    
     data;
}import java.util.List;

public class NodeTree {
    public int id;
    public String name;
    public int OwnerId;
    public List
    
    
     
      children;
}public class Menu {

    public NodeTree getMenu() {
        String jsonData = WSDLService.service.getNodeTree();// 项目上通过wsdl获取源数据
        Gson gson = new Gson();
        SourceDataPackage sourceDataPackage = gson.fromJson(jsonData, SourceDataPackage.class);
        List
     
     
      
       data = sourceDataPackage.data;
        NodeTree nodeTree = new NodeTree();
        for(SourceData sourceData : data) {
            if(sourceData.OwnerDeptId == 0) {
                nodeTree.id = sourceData.id;
                nodeTree.name = sourceData.name;
                nodeTree.children = new ArrayList<>();
                break;
            }
        }
        getResult(data, nodeTree);
        return nodeTree;
    }

    private void getResult(List
      
      
       
        data, NodeTree parentNodeTree) {
        for(SourceData sourceData : data) {
            if(nodeTree.id == sourceData.ownerid) {
                NodeTree nodeTree = new NodeTree();
                nodeTree.id = sourceData.id;
                nodeTree.name = sourceData.name;
                nodeTree.children = new ArrayList<>();
                parentNodeTree.children.add(nodeTree);
                getResult(data, nodeTree);
            }
        }
    }
}public class SourceData {
    public int id;
    public String name;
    public int OwnerId;
}
      
      
     
     
    
    
   
   

看到有人说递归的效率很低,那么像这种动态多级菜单的问题是否能通过非递归的方式去解决呢?

晚上瞎逛的时候看到一个帖子说了非递归的方法,似乎有优先深度遍历和优先广度遍历,转载一下地址,侵删。


java非递归遍历——华秋实的专栏

遍历多叉树(递归、非递归广度优先、深度优先)——D木Q

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值