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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值