日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

不用遞歸實(shí)現(xiàn)無限級下拉樹高效算法【原創(chuàng)】

系統(tǒng) 2172 0

在公司項(xiàng)目中用遞歸生成 Tree 時,出現(xiàn)了很嚴(yán)重的性能問題,在google 中 go 很久,也沒有找到不用遞歸實(shí)現(xiàn)無限級 Tree 的算法。后來,抱著嘗試的心理。結(jié)果,我用兩個循環(huán)就搞定了。自認(rèn)為這個算法應(yīng)該很高效,以后遞歸樹的地方我就用這個算法了。不過,需要注意的是,你的數(shù)據(jù)必須是根據(jù)ID從小到大排過序的。否則,就會顯示不正確。如果數(shù)據(jù)無序,建議你先排序然后才調(diào)用此算法。看來,我還是相當(dāng)聰明的嘛,嘿嘿

以下是代碼:

public static void main(String[] args)
?{
??/*------------- 樹形結(jié)構(gòu)測試數(shù)據(jù) START CODE --------------*/
??List<Object[]> list = new ArrayList<Object[]>();
??
??list.add(new Object[]{"AA1",999,0});
??list.add(new Object[]{"AA1_AA2",11,999});
??list.add(new Object[]{"AA1_AA1",10,999});
??list.add(new Object[]{"AA1_AA1_AA2",1001,10});
??list.add(new Object[]{"AA1_AA1_AA1",100,10});
??list.add(new Object[]{"AA1_AA1_AA2_AA1",100101,1001});
??list.add(new Object[]{"AA1_AA1_AA2_AA2",100102,1001});
??list.add(new Object[]{"BB1",2,0});
??list.add(new Object[]{"BB1_BB1",20,2});
??list.add(new Object[]{"BB1_BB1_BB1",200,20});
??list.add(new Object[]{"BB1_BB1_BB2",201,20});
??
??/*------------- 樹形結(jié)構(gòu)測試數(shù)據(jù) START END --------------*/
??
??StringBuffer sb = new StringBuffer();
??//存放符合條件的所有 節(jié)點(diǎn)ID
??List<Integer> aList = new ArrayList<Integer>();
??aList.add(999);?//測試查找以 3 作為父節(jié)點(diǎn)的所有 子節(jié)點(diǎn)列表
??//存放在內(nèi)部循環(huán)中所有找到的以指定ID作為父節(jié)點(diǎn)的子ID。
??List<Integer> tempList = new ArrayList<Integer>();
??
??for(int i=0,count=list.size();i<count; i++){
???Object[] arr = list.get(i);
???String name = arr[0].toString();
???int id = Integer.parseInt(arr[1].toString());
???int pid = Integer.parseInt(arr[2].toString());
???for(int j=0,len=aList.size(); j<len; j++){
????int currid = aList.get(j);
????if(id==currid || pid==currid){?//如果數(shù)據(jù)中 ID或 PID與指定 currid 相同
?????sb.append(name+"\n");
?????tempList.add(id);?//保存子節(jié)點(diǎn)ID到 tempList
????}
????//如果找到最后一個,并且 tempList 中有子節(jié)點(diǎn)的話,把 tempList 賦給 aList
????if(j==(len-1) && tempList.size()>0){?
?????aList = tempList;
????}
???}
??}
??//打印所有以 3 作為父節(jié)點(diǎn)的所有 子節(jié)點(diǎn)
??System.out.println(sb.toString());
?}

?

執(zhí)行結(jié)果如下:

AA1
AA1_AA2
AA1_AA1
AA1_AA1_AA2
AA1_AA1_AA1
AA1_AA1_AA2_AA1

不用遞歸實(shí)現(xiàn)無限級下拉樹高效算法【原創(chuàng)】


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 赤峰市| 韶关市| 阳西县| 黄骅市| 英山县| 洮南市| 新绛县| 夹江县| 湛江市| 乳山市| 蒙自县| 兖州市| 犍为县| 桃园市| 厦门市| 云龙县| 防城港市| 霍邱县| 余庆县| 泊头市| 呼和浩特市| 朔州市| 霍林郭勒市| 增城市| 康定县| 眉山市| 儋州市| 夏津县| 青海省| 内丘县| 东丽区| 阳泉市| 边坝县| 澳门| 云南省| 襄汾县| 德令哈市| 曲麻莱县| 合水县| 什邡市| 韶关市|