java TreeUtil菜单递归工具类
本文实例为大家分享了javaTreeUtil菜单递归工具类的具体代码,供大家参考,具体内容如下
菜单树(详细)
packagecom.admin.manager.storeService.util; importcom.admin.manager.storeService.entity.Menu; importjava.util.ArrayList; importjava.util.List; /** *@authorm *@date2019/12/16 */ publicclassTreeUtil{ /** *获取菜单树 *@parammenus所有菜单 *@return */ publicstaticList
上面这种递归,如果遇到大数据量,效率是极低的。比如前段时间刚实现了省市区镇四层的树结构,面对5万条的数据,竟然120s才递归完,这也太慢了,将来需求变成了省市区镇乡五层的结构,那不就挂了?
大眼一看,不是跟上面的一样嘛。仔细看it.remove();
假设有五万的数据,根节点1万,二级节点1万,三级节点1万,4级节点2万。如果按照上面的逻辑走,每次都要从5万中数据递归查找;而下面的逻辑是找到N级节点并且在总list中删除。假设找到根节点的1万数据,并且把他们从总list中删除,总list剩4万条数据,依次这样,到了找4级节点时,总list就已经剩2万条数据了,总数据量从5万变成了2万,循环次数就少了,效率也就高了
importcom.energy.service.vo.RegionTree; importjava.util.ArrayList; importjava.util.Iterator; importjava.util.List; /** *@authorm *@date2020/4/2 */ publicclassTreeUtil{ /** *创建树结构 *@paramregionTrees *@return */ privateListtree(List regionTrees){ //返回的节点树 List rootNodes=newArrayList<>(); Iterator it=regionTrees.iterator(); while(it.hasNext()){ RegionTreenext=it.next(); //parent(上级Id)为0的是根节点 if("0".equals(next.getParentId())){ rootNodes.add(next); it.remove(); } } //遍历,找到二级节点 for(RegionTreeregionTree:rootNodes){ List child=getChild(regionTrees,regionTree.getId().toString()); regionTree.setChildren(child); } returnrootNodes; } /** *查子节点 * *@paramregions *@paramparentId *@return */ privateList getChild(List regions,StringparentId){ //子节点列表 List childList=newArrayList<>(); Iterator it=regions.iterator(); while(it.hasNext()){ RegionTreeregionTree=it.next(); if(parentId.equals(regionTree.getParentId())){ childList.add(regionTree); it.remove(); } } //遍历递归获取子节点的子节点 for(RegionTreeregionTree:childList){ List child=getChild(regions,regionTree.getId().toString()); regionTree.setChildren(child); } //递归出口childList长度为0 if(childList.size()==0){ returnnewArrayList<>(); } returnchildList; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。