项目开发中,有一 菜单的树形结构展示时,需要统计各个菜单下记录的总数,通常如果树形结构的深度为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实现页面菜单展示也是通过递归完成的。结合上述统计,可以得到如下的菜单统计效果:
原文地址:http://blog.csdn.net/wojiushiwo945you/article/details/44222977