項目開發中。有一 菜單的樹形結構展現時,需要統計各個菜單下記錄的總數。一般假設樹形結構的深度爲2(僅僅有兩級菜單的話),使用for循環統計沒有問題。但是假設樹形菜單的深度沒有限制,就不能經過兩次for循環來實現統計了,僅僅能借助遞歸來統計了,使用一個全局map記錄每次統計的值。簡單實現例如如下:java
具備層級結構的元素Source類,省略getter/setter:code
public class Source { private Source parent; private String id; private String name; private List<Source> children; }統計方法。僅僅需要層級結構的根元素,就能夠完畢各個菜單子元素的統計:
import java.util.List; import java.util.Map; public class SourceCountUtil { /** * 樹形結構展現的某個節點的統計數值=孩子總數+孩子的孩子總數 * @param root * @param result * @return */ public static int doCount(Source root,Map<String,Object> result){ int count = 0; List<Source> list = root.getChildren(); if(list==null ||list.size()==0){ return count; } for (Source child : list) { //統計當前元素的子節點個數 count++; //統計子節點的孩子總數 int cur_cnt=doCount( child,result); result.put(String.valueOf(child.getId()), cur_cnt); count += cur_cnt; } //返回前記錄當前節點的統計個數 result.put(String.valueOf(root.getId()), count); return count; } }每次利用遞歸統計完一個菜單的子節點個數後,存入map中。最後輸出的result存儲了所有菜單的子元素的個數。
dtree.js實現頁面菜單展現也是經過遞歸完畢的。結合上述統計,可以獲得例如如下的菜單統計效果:遞歸