map的樹型算法

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章