递归 逐层统计树形结构数据

本文介绍了一种通过递归算法构建树形结构的方法,主要应用于报表数据的层级展示。该方法通过遍历数据集来获取各个级别的节点,并将它们组织成树状结构,适用于多级分类的数据统计。
将集合递归获取树形结构:


/**
*
* 递归获取数据
* @param alist:所有分类
* @param subjname:对应统计的项目名称
* @param pk:对应项目主键
* @param reportList: 最后统计的结果集
* @param count:项目级别
*/

public void getReportVO(ArrayList<ReportVO> alist,String subjname,String pk,ArrayList<ReportVO> reportList,int count) throws BusinessException {
ArrayList<String> str=new ArrayList<String>();
//不同级别用空格区分
for(int i=0;i<count;i++){
subjname=" "+subjname;

}

//根据pk获取末节点VO
getEndNodes( pk, alist, str);
//存在下级节点 则查询出所有数据
if(str!=null&&!str.equals("")){
String[][] data=new String[str.size()][1];
for(int i=0;i<str.size();i++){
data[i][0]=str.get(i);

}
//根据项目名和末级节点得到数据
ReportVO reportvo=getEndNodeData(subjname,data);
reportList.add(reportvo);

}else{
//不存在下级节点
String[][] data=new String[1][1];
data[0][0]=pk;
ReportVO reportvo=getEndNodeData(subjname,data);
reportList.add(reportvo);
}

//递归统计节点数据
for(int i=0;i<alist.size();i++){
if(alist.get(i).getParentpk()!=null&&pk.equals(alist.get(i).getParentpk())){
ReportVO reportvo=alist.get(i);
String pk_costsubj_type = alist.get(i).getPk();
getReportVO(alist,reportvo.getSubjname(),pk_costsubj_type,reportList,count+1);

}
}
}


/**
*
* 递归方法 查找末级节点
* @param pk 项目主键
* @param list 所有分类
* @param str 所有末级节点pk集合
*/

public void getEndNodes(String pk, ArrayList<ReportVO> list,ArrayList<String> str) throws BusinessException {


boolean flag = false;

for(int i=0;i<list.size();i++){
//查找该主键的子节点
if(list.get(i).getParentpk()!=null&&pk.equals(list.get(i).getParentpk())){
flag = true;
String pk_costsubj_type = list.get(i).getPk();
getEndNodes(pk_costsubj_type,list,str);
}
}
//如果是最末级
if(!flag){
str.add(pk);
}


}
在 Java 中通过递归方法构建组织机构的树形结构,通常需要定义一个表示组织节点的类,然后根据数据源(如列表)递归地构建树结构。以下是具体的实现步骤和代码示例: ### 定义组织节点类 首先定义一个 `Org` 类来表示组织机构中的每个节点。该类包含节点的 ID、名称、子节点列表以及节点数据(如人数或统计信息)。 ```java public class Org<T> { private String id; private String name; private List<Org<T>> children; private T data; public Org(String id, String name, T data) { this.id = id; this.name = name; this.data = data; this.children = new ArrayList<>(); } // Getters and Setters public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<Org<T>> getChildren() { return children; } public void setChildren(List<Org<T>> children) { this.children = children; } public T getData() { return data; } public void setData(T data) { this.data = data; } public void addChild(Org<T> child) { children.add(child); } } ``` ### 构建树结构 接下来,需要根据扁平化的数据(如数据库查询结果)构建树结构。可以通过递归的方式,将每个节点的子节点逐层构建出来。 ```java public class OrgTreeBuilder { public static Org<Long> buildOrgTree(List<Org<Long>> orgList, String rootId) { // 创建一个 Map 来存储所有节点,便于后续查找 Map<String, Org<Long>> orgMap = new HashMap<>(); for (Org<Long> org : orgList) { orgMap.put(org.getId(), org); } Org<Long> rootOrg = null; // 遍历所有节点,将子节点添加到对应的父节点中 for (Org<Long> org : orgList) { if (org.getId().equals(rootId)) { rootOrg = org; } else { Org<Long> parent = orgMap.get(org.getParentId()); // 假设有 getParentId() 方法 if (parent != null) { parent.addChild(org); } } } return rootOrg; } } ``` ### 递归汇总数据 在构建完树结构后,可以通过递归方法自下而上地汇总每个节点的数据。例如,汇总每个部门的人数。 ```java public class OrgDataAggregator { public static Org<Long> calculateWithRecursion(Org<Long> rootOrg) { if (rootOrg == null || rootOrg.getChildren().isEmpty()) { return rootOrg; } Long totalData = rootOrg.getData(); for (Org<Long> child : rootOrg.getChildren()) { Org<Long> updatedChild = calculateWithRecursion(child); totalData += updatedChild.getData(); } rootOrg.setData(totalData); return rootOrg; } } ``` ### 示例数据与调用 假设有一个扁平化的组织列表,并希望构建树结构并汇总数据。 ```java public class Main { public static void main(String[] args) { // 初始化组织数据 Org<Long> org100 = new Org<>("100", "中国科技", 0L); Org<Long> org101 = new Org<>("101", "深圳总公司", 100L); Org<Long> org102 = new Org<>("102", "长沙分公司", 80L); Org<Long> org103 = new Org<>("103", "研发部门", 50L); Org<Long> org104 = new Org<>("104", "市场部门", 30L); Org<Long> org105 = new Org<>("105", "测试部门", 20L); Org<Long> org108 = new Org<>("108", "市场部门", 40L); Org<Long> org109 = new Org<>("109", "财务部门", 40L); // 构建树结构 org101.addChild(org103); org101.addChild(org104); org101.addChild(org105); org102.addChild(org108); org102.addChild(org109); org100.addChild(org101); org100.addChild(org102); // 汇总数据 Org<Long> updatedRoot = OrgDataAggregator.calculateWithRecursion(org100); // 打印汇总后的数据 System.out.println("Root Org Data: " + updatedRoot.getData()); // 输出 320L } } ``` ### 说明 - **树结构构建**:通过 `buildOrgTree` 方法,将扁平化的数据构建成树形结构。 - **递归汇总**:通过 `calculateWithRecursion` 方法,从叶子节点开始向上汇总数据。 - **效率优化**:使用 `Map` 来存储节点,便于快速查找父节点,避免多次遍历列表。 这种方法能够高效地构建树结构并进行数据汇总,适用于组织机构、分类树等场景[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值