上乙個遞迴方法講的是使用遞迴方法查詢所有分類下的文件,這種方式查出來的結果是乙個列表,不便於區分層級關係。今天來講乙個樹結構的拼接方法,也就是通過父id查詢子類,將子類的結果集拼接到父類下面,再查子類的子類,無限的查下去,查到null為止,拼接起來的結果,像一顆樹的結構一樣有粗有細有分支,哈哈~
以建立分類的樹結構為例,所有的型別,都有自己的id和superid(父id),我們只要根據superid查詢它下面有沒有子類id,如果有,再將子類的id作為新的superid繼續查,一直查到null為止,然後將所有查到的結果拼接成一層套一層的結構即可,結果例如下圖的這個樣紙~:
這裡可能有人會問,如果是第一級分類,那它的superid是啥呢?問的好,我們在錄入分類的時候,如果是第一級分類,我們隨便給所有的一級分類給乙個統一的superid即可,比如我給的就是「0」,也就是我們遞迴的時候,從superid=「0」開始往下查就行了~。
樹結構的**,只要想通了邏輯,其實非常簡單,話不多說,原始碼走起~
這裡我多加了乙個totalcount,是為了統計一下一共有多少個分類,outgoingutils是我自己封裝的乙個返回方式而已,這兩個都可以忽略,忽略完之後,其實controller就是一行**:service.gettypetree();
//型別樹結構
(value =
"/gettypetree"
,method = requestmethod.get)
public map
gettypetree()
我們在service層來寫遞迴邏輯
public list
>
gettypetree()
//遞迴方法
private list
>
childtype
(string superid)
}return list;
}
gettypetree()方法中,就傳了個一級分類的superid=「0」,然後進入到遞迴方法中自己調自己玩一陣子,就把樹結構返回給controller了,是不是很easy~
@select
("select * from cx_knowledge_content_type where superid=#"
)public list
findbysuperid
(@param
("superid"
) string superid)
;
整個遞迴方法,就用到了乙個findbysuperid方法,是不是比想象中的容易多了~
,],"name":"廚房電器","id":"3"}],"name":"家用電器","id":"2"}],"name":"電器","id":"1"}],"message":"success","totalcount":5}
可用將結果複製到中展示結果。
我在做這個遞迴的時候,用的是list>,在遍歷子集的時候,用乙個map去放想放的結果,這個是很常用的,建議大家多用用。
如果不使用list>也可以做到樹結構,那就是在實體類裡面增加乙個引數,比如我們的實體類叫contenttype,那麼再加乙個型別為list< contenttype>的,名稱比方說叫childtype的引數,給它get、set方法,然後在遞迴的過程中,將子集放到這個childtype中就好了~兩種方法沒有好壞,就看自己喜歡那個就用哪個就好了!
使用遞迴演算法實現樹結構
新專案需要用到左側選單欄的遍歷效果 所以自己研究寫了乙個遞迴實現樹結構的工具類 後台正常查詢資料集合,不過因為是樹結構,必須要有關聯關係的字段 注釋中會寫細節部分,如下 遞迴實現樹形工具類 public class treeutils return returntree 根據跟節點查詢子節點 roo...
使用js進行二叉樹結構資料與陣列結構資料的互相轉化
簡單的說下本示例中的樹形資料的結構 type logic content and left right 即每個節點都包含type,content,left,right四個屬性,其中type,content包含該結點的資料,left和right包含該借點的左右子樹節點。而我們關心的資料始終都包含在葉子...
C 資料結構4 二分查詢(遞迴方法)
同樣的100萬個資料,順序查詢需要50萬次,而二分查詢需要20次左右既可以了。但是二分查詢需要的資料是已經排列好的,無序的資料則用不了二分查詢。include 二分查詢 必須是已經排序好的數,有遞迴和迭代 迴圈 兩種方式,遞迴的效率比迭代的效率高得多 using namespace std int ...