zoukankan      html  css  js  c++  java
  • Java实现多层级数据的查询(递归)

    1. 菜单实体类:

    public class Menu {
       // 菜单id
       private String id;
       // 菜单名称
       private String name;
       // 父菜单id
       private String parentId;
       // 菜单url
       private String url;
       // 菜单图标
       private String icon;
       // 菜单顺序
       private int order;
       // 子菜单
       private List<Menu> children;
       // ... 省去getter和setter方法以及toString方法
    }
    


    2. 菜单一般需要排序,我们根据Menu的order字段进行排序:

    /*
       * 排序,根据order排序
       */
      public Comparator<Menu> order(){
        Comparator<Menu> comparator = new Comparator<Menu>() {
          @Override
          public int compare(Menu o1, Menu o2) {
            if (o1.getOrder() != o2.getOrder()){
              return o1.getOrder() - o2.getOrder();
            }
            return 0 ;
          }
        };
        return comparator;
      }
    


    3. 生成树的方法:

    public Map<String,Object> findTree(){
       Map<String,Object> data = new HashMap<String,Object>();
         try { //查询所有菜单
           List<Menu> allMenu = menuDao.findTree();
           //根节点
           List<Menu> rootMenu = new ArrayList<Menu>();
           for (Menu nav : allMenu) {
             if (nav.getParentId().equals( "0" )){ //父节点是0的,为根节点。
               rootMenu.add(nav);
             }
           }
           /* 根据Menu类的order排序 */
           Collections.sort(rootMenu, order());
           //为根菜单设置子菜单,getClild是递归调用的
           for (Menu nav : rootMenu) {
             /* 获取根节点下的所有子节点 使用getChild方法*/
             List<Menu> childList = getChild(nav.getId(), allMenu);
             nav.setChildren(childList);//给根节点设置子节点
           }
           /**
            * 输出构建好的菜单数据。
            *
            */
           data.put( "success" , "true" );
           data.put( "list" , rootMenu);
           return data;
         } catch (Exception e) {
           data.put( "success" , "false" );
           data.put( "list" , new ArrayList());
           return data;
         }
    }
    


    4. 获取子菜单:

        /**
        * 获取子节点
        * @param id 父节点id
        * @param allMenu 所有菜单列表
        * @return 每个根节点下,所有子菜单列表
        */
       public List<Menu> getChild(String id,List<Menu> allMenu){
         //子菜单
         List<Menu> childList = new ArrayList<Menu>();
         for (Menu nav : allMenu) {
           // 遍历所有节点,将所有菜单的父id与传过来的根节点的id比较
           //相等说明:为该根节点的子节点。
           if (nav.ParentId().equals(id)){
             childList.add(nav);
           }
         }
         //递归
         for (Menu nav : childList) {
           nav.setChildren(getChild(nav.getId(), allMenu));
         }
         Collections.sort(childList,order()); //排序
         //如果节点下没有子节点,返回一个空List(递归退出)
         if (childList.size() == 0 ){
           return new ArrayList<Menu>();
         }
         return childList;
       }
    


    5. 最后返回的JSON串:

    {
      "success" : "true" ,
      "list" : [
        {
         "id" : "1" ,
         "name" : "Java" ,
         "parentid" : "0" ,
         "url" : "http://www.aliouchen.com" ,
         "order" : 1 ,
         "children" : [
          {
            "id" : "2" ,
            "name" : "并发编程" ,
            "parentid" : "1" ,
            "url" : "http://www.aliouchen.com" ,
            "order" : 1 ,
            "children" : []
          },
          {
            "id" : "3" ,
            "name" : "多线程" ,
            "parentid" : "1" ,
            "url" : "http://www.aliouchen.com" ,
            "order" : 2 ,
            "children" : [
              "id" : "4" ,
              "name" : "Thread" ,
              "parentid" : "3" ,
              "url" : "http://www.aliouchen.com" ,
              "order" : 1 ,
               "children" :[]
            ]
          }
         ]
        },
        {
         "id" : "5" ,
         "name" : "Python" ,
         "parentid" : "0" ,
         "url" : "http://www.aliouchen.com" ,
         "order" : 2 ,
         "children" : []
        }
       ]
    }
    
  • 相关阅读:
    Ruby小白入门笔记之<个人记录档>
    Windows 10下怎么远程连接 Ubuntu 16.0.4(小白级教程)
    Ruby小白入门笔记之<Rails项目目录结构>
    GitHub 上传文件
    机器学习:项目流程及方法(以 kaggle 实例解释)
    数据科学:待学习的内容
    机器学习:项目流程
    数据科学:numpy.where() 的用法
    数据科学:Pandas 和 Series 的 describe() 方法
    Kaggle 比赛项目总结(项目流程)
  • 原文地址:https://www.cnblogs.com/itlihao/p/14526178.html
Copyright © 2011-2022 走看看