在公司項(xiàng)目中用遞歸生成 Tree 時(shí),出現(xiàn)了很?chē)?yán)重的性能問(wèn)題,在google 中 go 很久,也沒(méi)有找到不用遞歸實(shí)現(xiàn)無(wú)限級(jí) Tree 的算法。后來(lái),抱著嘗試的心理。結(jié)果,我用兩個(gè)循環(huán)就搞定了。自認(rèn)為這個(gè)算法應(yīng)該很高效,以后遞歸樹(shù)的地方我就用這個(gè)算法了。不過(guò),需要注意的是,你的數(shù)據(jù)必須是根據(jù)ID從小到大排過(guò)序的。否則,就會(huì)顯示不正確。如果數(shù)據(jù)無(wú)序,建議你先排序然后才調(diào)用此算法。看來(lái),我還是相當(dāng)聰明的嘛,嘿嘿
以下是代碼:
public static void main(String[] args)
?{
??/*------------- 樹(shù)形結(jié)構(gòu)測(cè)試數(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});
??
??/*------------- 樹(shù)形結(jié)構(gòu)測(cè)試數(shù)據(jù) START END --------------*/
??
??StringBuffer sb = new StringBuffer();
??//存放符合條件的所有 節(jié)點(diǎn)ID
??List<Integer> aList = new ArrayList<Integer>();
??aList.add(999);?//測(cè)試查找以 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
????}
????//如果找到最后一個(gè),并且 tempList 中有子節(jié)點(diǎn)的話(huà),把 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ù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
