數據源:
關於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);
}