标签导航:

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

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

原始代码中,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;
}