java中深入浅析的TreeUtil菜单递归工具类

  介绍

深入浅析java中的TreeUtil菜单递归工具类?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

菜单树(详细)

包com.admin.manager.storeService.util;
  
  进口com.admin.manager.storeService.entity.Menu;
  
  进口java.util.ArrayList;
  进口并不知道;/* *
  * @author m
  * @date 2019/12/16
  */公开课TreeUtil {/* *
  *获取菜单树
  * @param菜单所有菜单
  * @return
  */公共静态ListmenuTree (List菜单){//返回的菜单树
  List,rootMenus=new ArrayList<的在();
  (菜单菜单:菜单){//pid(上级Id)为0的是根菜单
  如果(“0”;.equals (menu.getPid ())) {
  rootMenus.add(菜单);
  }
  }//遍历,找到二级菜单(根菜单的id和所有菜单中的pid比较)
  (菜单rootMenu: rootMenus) {
  List孩子=getChild (String.valueOf (rootMenu.getId()),菜单);
  rootMenu.setChildren(孩子);
  }
  返回rootMenus;
  }/* *
  *递归获取下级菜单
  * @param pid上级Id
  * @param菜单所有菜单
  * @return
  */公共静态ListgetChild(字符串pid, List菜单){//子菜单列表
  List,childList=new ArrayList<的在();
  (菜单菜单:菜单){
  如果(pid.equals (menu.getPid ())) {
  childList.add(菜单);
  }
  }//遍历递归获取子菜单的子菜单
  (菜单菜单:childList) {
  List孩子=getChild (String.valueOf (menu.getId()),菜单);
  menu.setChildren(孩子);
  }//递归出口childList长度为0
  如果(childList.size ()==0) {
  返回新ArrayList<在();
  }
  返回childList;
  }
  }

上面这种递归,如果遇到大数据量,效率是极低的,比如前段时间刚实现了省市区镇四层的树结构,面对万5条的数据,竟然120年代才递归完,这也太慢了,将来需求变成了省市区镇乡五层的结构,那不就挂了?

大眼一看,不是跟上面的一样嘛。仔细看拔除();

假设有五万的数据,根节点1万,二级节点1万,三级节点1万,4级节点2万。如果按照上面的逻辑走,每次都要从5万中数据递归查找;而下面的逻辑是找到N级节点并且在总表中删除。假设找到根节点的1万数据,并且把他们从总列表中删除,总列表万剩4条数据,依次这样,到了找4级节点时,总列表就已经万剩2条数据了,总数据量从5万变成了2万,循环次数就少了,效率也就高了

进口com.energy.service.vo.RegionTree;
  
  进口java.util.ArrayList;
  进口java.util.Iterator;
  进口并不知道;/* *
  * @author m
  * @date 2020/4/2
  */公开课TreeUtil {/* *
  *创建树结构
  * @param regionTrees
  * @return
  */私人List树(ListregionTrees) {//返回的节点树
  List,rootNodes=new ArrayList<的在();
  Iterator它=regionTrees.iterator ();
  而(it.hasNext ()) {
  下=RegionTree it.next ();//父(上级Id)为0的是根节点
  如果(“0”;.equals (next.getParentId ())) {
  rootNodes.add(下);
  拔除();
  }
  }//遍历,找到二级节点
  (RegionTree RegionTree: rootNodes) {
  List孩子=getChild (regionTrees regionTree.getId () .toString ());
  regionTree.setChildren(孩子);
  }
  返回rootNodes;
  
  }/* *
  *查子节点
  *
  * @param地区
  * @param parentId
  * @return
  */私人ListgetChild (List地区,字符串parentId) {//子节点列的表
  List,childList=new ArrayList<的在();
  Iterator它=regions.iterator ();
  而(it.hasNext ()) {
  RegionTree RegionTree=it.next ();
  如果(parentId.equals (regionTree.getParentId ())) {
  childList.add (regionTree);
  拔除();
  }
  }//遍历递归获取子节点的子节点
  (RegionTree RegionTree: childList) {
  List孩子=getChild(地区,regionTree.getId () .toString ());
  regionTree.setChildren(孩子);
  }//递归出口childList长度为0
  如果(childList.size ()==0) {
  返回新ArrayList<在();
  }
  返回childList;
  }
  }

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

java中深入浅析的TreeUtil菜单递归工具类