如何优化递归生成树结构代码的性能?

优化祖传递归树结构生成代码

本文针对一段使用递归生成树结构的代码进行性能优化分析。代码的主要问题在于使用了低效的递归方式以及一些可优化的细节。

原始代码中,creategrouptreenode 函数调用 getchildlist 函数递归生成树形结构。getchildlist 函数接收一个父节点 id 和一个列表作为参数,递归地查询子节点并添加到列表中。然而,这种方式存在效率问题。

首先,getchildlist 函数的第二个参数 childrenlist 实际上是一个输出参数,只有当 id == 0l 时才会使用。 这导致了不必要的参数传递和内存开销。我们可以直接修改 getchildlist 函数,使其返回生成的子节点列表,从而消除这个冗余参数。 修改后的 creategrouptreenode 函数可以直接使用 getchildlist 函数的返回值,简化代码结构并提高效率。

其次,在 getchildlist 函数的 for 循环中,反复调用 childlist.get(i) 获取 basegroup 对象,造成了不必要的性能损耗。 我们可以通过引入一个中间变量缓存 childlist.get(i) 的结果,或者直接使用增强型 for 循环来避免重复访问数组元素。

此外,for 循环内部的 if 分支条件判断语句中,大部分代码都是相同的,只有 isleaf 和 children 属性的值不同。 我们可以将公共部分提取出来,只保留差异部分的判断,从而简化代码并提高可读性。

通过以上优化,可以有效提高代码效率,减少不必要的内存开销和计算次数。 具体优化方案如下:

修改后的 creategrouptreenode 函数:

public list<map> creategrouptreenode() {     list<map> childrenlist = getchildlist(0l);     // .... }

修改后的 getchildlist 函数:

public List<Map> getChildList(Long id) {     List<BaseGroup> childList = baseMapper.childListByParentId(id);     if(childList != null && childList.size() > 0){         List<Map> tempMap = new ArrayList<Map>();         for (BaseGroup it : childList) {             Map map = new HashMap();             map.put("id", it.getId());             map.put("text", it.getNumber() + " - " + it.getName());             map.put("icon", "fa fa-folder");             Map subMap = new HashMap();             subMap.put("opened", false);             map.put("state", subMap);              List<Map> mylist = getChildList(it.getId());             if (mylist == null) {                 map.put("isleaf", "1");             } else {                 map.put("isleaf", "0");                 map.put("children", mylist);             }             tempMap.add(map);         }         return tempMap;     }     return null; }

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享