之前對於樹狀結構的處理沒什么困難,但是最近的一個需求就很麻煩。其實遍歷出樹狀結構並不是什么困難的事情,但是這個需求需要從底層節點統計數量,然后向上修改所有的父級結構。
最難的地方就是這個地方,可能有的子節點大部分是最后一級,但是平級可能還會有多層數據。之前試過用遞歸結構實現。但是容易造成死鎖,原因就是在向上修改數據時平級的子節點也在
向上修改,就會造成死鎖。這個需求擱置了很久,一直沒有什么好辦法。
直到前幾天瀏覽文章時突然看到了,stream流的排序功能,突然思如泉涌。排序算法可以自定義還能支持多層排序,一步一步梳理完成。
我的思路是這樣的,先拿到所有的二級結構,因為二級結構需要做最后的數據匯總,然后遍歷出所有的二級結構樹,這里可能數據庫的設計師不一致的。但是,思路可以通用,這邊我這個數
據里面保存了一個節點路徑,
先使用條件限定查找范圍,因為字符串的匹配可能不精確。通過二級節點搜索包含節點id的路徑,用list集合包裝起來。這樣每個二級節點就是一個單獨的樹,再做處理就方便多了。
如果沒有好的條件可以快速定位節點,建議使用遞歸,通過關聯關系遍歷獲取數據。建議存入list集合,因為只在后台計算的話逆向遍歷樹結構很麻煩。這是一個樹結構的實體
如果是這種結構的話,遍歷太容易死鎖。然后對這幾個list集合進行排序,這里有個示例,通過子父id進行排序
list.stream().sorted((s1,s2)->{ if(s1.getPid = s2.getId){ return 1; } }).forEach(System.out::println);
如果還有其他的排序需求,直接接上thenCompaing可繼續對集合進行排序。然后用stream中的limit方法切割集合,找到集合中id不作為任何元素PID的數據,從這個位置開始切割。然后開始對數據進行處理。第一位的數據就是你的第三層結構,注意這里要對你的一級二級結構做判斷如果沒有下級就直接修改,然后吧第三級匯總至第二級,最后用stream流求第二級總和,存入第一級節點就ok。說起來很繞,但是面對樹狀結構最好使用圖數據庫,或者添加路徑以及其他索引方式,不要只用子父id對應。