我有一個實體 PropTemplateItem{id,名稱,父節點,模版id},父節點爲root是定義爲根節點。數據庫
例如數據: 性能
001,顏色,root,123學習
002,白色,001,123spa
003,紅色,001,1233d
004,配置,root,123對象
005,低配,004,123blog
006,高配,004,123配置
本身定義一個model(PropTemplateItemInfo模型,有一個根節點,有多個子節點)List
怎樣才能把上述示例數據中存放到自定義模型裏?model
1.經過數據庫直接查詢(先查出全部根節點,在遍歷全部根節點查詢起全部子節點) 與數據庫交互太多,特別在數據量大了時缺點更明顯
2.經過數據庫查詢出該模版下全部節點,而後經過遍歷這個列表,判斷爲root節點的就在這個循環裏面在遍歷這個列表,找到父節點id等於這個root節點id的節點,放到本身定義模型裏面去。遍歷次數應該是n(list.size())*n 這是最容易想到的辦法,但嵌套的遍歷在數據量大時消耗的性能就比較高了
3.經過數據庫查詢出該模版下全部節點,經過map來存放篩選結果,遍歷次數就只有n(list.size())*2
代碼以下
第一次遍歷這個列表時,找到全部root節點,放在map中,map的key就是他的id,而後新建一個PropTemplateItemInfo對象,把他的root節點放進去。
第二次遍歷這個列表時,判斷map裏面是否存在這個key,若是存在,就把這個對象從map中取出來,把他的子節點的值add進那個map。
咱們最終要返回圖中名爲infoList的對象,由於圖中2個循環中全在操做同一個名爲tpl的對象,因此infoList中的tpl對象也會隨之變化。
若有不足,請你們分享您的見解建議,互相學習,相互提升。