項目開發中。有一 菜單的樹形結構展示時,須要統計各個菜單下記錄的總數。通常假設樹形結構的深度為2(僅僅有兩級菜單的話),使用for循環統計沒有問題。可是假設樹形菜單的深度沒有限制,就不能通過兩次for循環來實現統計了,僅僅能借助遞歸來統計了,使用一個全局map記錄每次統計的值。簡單實現例如以下:
具有層級結構的元素Source類,省略getter/setter:
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實現頁面菜單展示也是通過遞歸完畢的。結合上述統計,能夠得到例如以下的菜單統計效果:

