将集合递归获取树形结构:
/**
*
* 递归获取数据
* @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);
}
}