数据源:
关于n年中某考试申请,通过未发证,发证的统计;
申请表:申请时间,籍贯省,籍贯市,申请人类型 ,申请数,申请人编号 ;
申请人类型有两种 A和B
通过未发证:审核时间,审核申请人类型 ,通过数,申请人编号;
已发证:发证时间,已发证申请人类型 ,发证数,申请人编号
表关联 申请表中的申请人编号
生成要求:
每个省合计;每个月合计;每年合计
实现步骤:
LevelBean类 存储单个数据bean
public class LevelBean {
private String level1="";
private String level2="";
private String level3="";
private String level4="";
private String level5="";
private String level6="";
private String level7="";
private DataBean statdata;
.
.
.
}
DataBean 类 存储每个类型数
StatCommon类
/**
*
* @param map new TreeMap
* @param list 三个表的falist 结构 年、月、省、市、类型 、数 怎么得到list就不说了
* @param maxlevel 最大层 考虑到需求中可能会去掉某个层次
* @return TreeMap ({2006={03={11={1101={1=bean, 2=bean}}, 14={1411={2=bean}}, 15={1504={2=bean}, 1506={1=bean}}}, 04={11={1101={1=bean, 2=bean}},....)
*/
public TreeMap getStatMapData(TreeMap map,List list,int maxlevel){
for(int i=0;i<list.size();i++){
LevelBean lBean=(LevelBean) list.get(i);
putdata(map,lBean,1,maxlevel);
}
return map;
}
/**
*
* @param map
* @param lBean
* @param curentlevel // 当前起始层
* @param maxlevel
*/
private void putdata(TreeMap map,LevelBean lBean,int curentlevel,int maxlevel){
Object temp;
// if (curentlevel > maxlevel)
// return;
if(map.containsKey(getLevelCaption(lBean,curentlevel))){
temp = map.get(getLevelCaption(lBean,curentlevel));
if(maxlevel == curentlevel){
sumStatdata(lBean.getStatdata(),(DataBean)temp);
//统计值
}else
{
putdata((TreeMap)temp,lBean,++curentlevel,maxlevel);
}
}else
{
if(maxlevel == curentlevel){
temp = lBean.getStatdata();
map.put(getLevelCaption(lBean,curentlevel), temp);
}
else
{
temp = new TreeMap();
map.put(getLevelCaption(lBean,curentlevel), temp);
putdata((TreeMap)temp,lBean,++curentlevel,maxlevel);
}
}
}
private String getLevelCaption(LevelBean lBean,int level){
switch (level){
case 1:
return lBean.getLevel1();
case 2:
return lBean.getLevel2();
case 3:
return lBean.getLevel3();
case 4:
return lBean.getLevel4();
case 5:
return lBean.getLevel5();
case 6:
return lBean.getLevel6();
case 7:
return lBean.getLevel7();
default:
return lBean.getLevel1();
}
}
private void sumStatdata(DataBean sourcedata,DataBean destdata){
destdata.setData1(destdata.getData1() + sourcedata.getData1());
destdata.setData2(destdata.getData2() + sourcedata.getData2());
destdata.setData3(destdata.getData3() + sourcedata.getData3());
destdata.setData4(destdata.getData4() + sourcedata.getData4());
destdata.setData5(destdata.getData5() + sourcedata.getData5());
}
/**
*
* @param datamap 数据map
* @param maxlevel 最大层
* @param stat//业务层接口
*/
public void CheckData(Map datamap ,int maxlevel,StatisticsImp stat){
String keys[] = new String[7]; //假设层次最大有7层
List statlist = new ArrayList(7); //用来存储每层数据
doCheckdata(datamap,maxlevel,stat,1,keys,statlist);
}
private void doCheckdata(Map datamap ,int maxlevel,StatisticsImp stat,int curentlevel,String keys[],List statlist){
Object temp;
if (curentlevel > maxlevel)
return;
Iterator it= datamap.keySet().iterator();
while(it.hasNext()){
keys[curentlevel-1] = (String)it.next();
if (curentlevel == maxlevel)
{
//处理数据
DataBean data=(DataBean)datamap.get(keys[curentlevel-1]);
temp = stat.makeAData(keys,curentlevel, data);
stat.addData(temp,curentlevel,maxlevel);
//统计计数
if (curentlevel>1)
stat.sumData(temp, statlist.get(curentlevel-2));
}
else
{
Map val=(Map)datamap.get(keys[curentlevel-1]);
temp = stat.makeAData(keys,curentlevel, null);
statlist.add(temp);
doCheckdata(val,maxlevel,stat,curentlevel + 1,keys,statlist);
stat.addData(temp,curentlevel, maxlevel);
//统计计数
if (curentlevel>1)
stat.sumData(temp, statlist.get(curentlevel-2));
statlist.remove(temp);
}
}
}
StatisticsImp 业务接口bean
public interface StatisticsImp {
//声称一个业务数据bean
public Object makeAData(String levelCaptions[],int level,DataBean dataBean);
//统计数据
//sourceData + destData 存储到 destData
public void sumData(Object sourceData,Object destData);
//增加一个数据
public void addData(Object data,int level,int maxlevel);
}