如何優(yōu)化遞歸生成樹結(jié)構(gòu)代碼的性能?

優(yōu)化祖?zhèn)?a href="http://www.babyishan.com/tag/%e9%80%92%e5%bd%92">遞歸樹結(jié)構(gòu)生成代碼

本文針對(duì)一段使用遞歸生成樹結(jié)構(gòu)的代碼進(jìn)行性能優(yōu)化分析。代碼的主要問題在于使用了低效的遞歸方式以及一些可優(yōu)化的細(xì)節(jié)。

原始代碼中,creategrouptreenode 函數(shù)調(diào)用 getchildlist 函數(shù)遞歸生成樹形結(jié)構(gòu)。getchildlist 函數(shù)接收一個(gè)父節(jié)點(diǎn) id 和一個(gè)列表作為參數(shù),遞歸地查詢子節(jié)點(diǎn)并添加到列表中。然而,這種方式存在效率問題。

首先,getchildlist 函數(shù)的第二個(gè)參數(shù) childrenlist 實(shí)際上是一個(gè)輸出參數(shù),只有當(dāng) id == 0l 時(shí)才會(huì)使用。 這導(dǎo)致了不必要的參數(shù)傳遞和內(nèi)存開銷。我們可以直接修改 getchildlist 函數(shù),使其返回生成的子節(jié)點(diǎn)列表,從而消除這個(gè)冗余參數(shù)。 修改后的 creategrouptreenode 函數(shù)可以直接使用 getchildlist 函數(shù)的返回值,簡(jiǎn)化代碼結(jié)構(gòu)并提高效率。

其次,在 getchildlist 函數(shù)的 for 循環(huán)中,反復(fù)調(diào)用 childlist.get(i) 獲取 basegroup 對(duì)象,造成了不必要的性能損耗。 我們可以通過引入一個(gè)中間變量緩存 childlist.get(i) 的結(jié)果,或者直接使用增強(qiáng)型 for 循環(huán)來(lái)避免重復(fù)訪問數(shù)組元素。

此外,for 循環(huán)內(nèi)部的 if 分支條件判斷語(yǔ)句中,大部分代碼都是相同的,只有 isleaf 和 children 屬性的值不同。 我們可以將公共部分提取出來(lái),只保留差異部分的判斷,從而簡(jiǎn)化代碼并提高可讀性。

通過以上優(yōu)化,可以有效提高代碼效率,減少不必要的內(nèi)存開銷和計(jì)算次數(shù)。 具體優(yōu)化方案如下:

修改后的 creategrouptreenode 函數(shù):

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

修改后的 getchildlist 函數(shù):

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; }

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊10 分享
站長(zhǎng)的頭像-小浪學(xué)習(xí)網(wǎng)月度會(huì)員