树形

来源:互联网 发布:0ffice2007办公软件 编辑:程序博客网 时间:2024/05/21 14:39

注:这是一个简单的三层树形结构,通过数据库传来的6个字段来生成

id1   name1  根节点

id2   name2  枝节点

id3   name3  末节点

 

VO部分 TmpTree的结构:

  Integer id;

  String name;

  List<TmpTree> tmpTree;

 

构造方法getStationTree:

@SuppressWarnings("unchecked")
 public List getStationTree(String paraType){
  String sql="SELECT distinct addvcd, addvname,stid,stname, sub_stid, sub_stname, paratype, paratypename,substationid,sub_sttype,sub_ststate,ststate,statename FROM vw_substation_base where 1=1 and paratype='"+paraType+"' order by addvcd,stid,sub_stid ";
  JdbcTemplate jdbcTemp = new JdbcTemplate(dataSource);
  List a = jdbcTemp.queryForList(sql);
  //最终得到的结果集
  List resultList = new ArrayList();
  //测试用结果集,记得删除
  List resultList2 = new ArrayList();
  Iterator<Map> it = a.iterator();
  //用于存放全部结果集的字符串
  List tmpStr = new ArrayList();
  while(it.hasNext()) {
   Map m=it.next();
   String id1=(String) m.get("addvcd");
   String name1=(String) m.get("addvname");
   String id2=(Integer) m.get("stid")+"";
   String name2=(String) m.get("stname");
   String id3=(Integer) m.get("sub_stid")+"";
   String name3=(String) m.get("sub_stname");
   /**
    * //构建结果集字符串 形式为 A级名称-A级ID,B级名称-B级ID,C级名称-C级ID
    */
   tmpStr.add(id1+"-"+name1+","+id2+"-"+name2+","+id3+"-"+name3);
  }
  //记录最后一次A键值对 用于清空B+C累加
  String lastStr = "";
  //用于分离出A级 名称-ID键值对的map对象
  Map map = new HashMap();
  //用于存放被截取掉A级,剩余B、C级的字符串
  String sedStr = "";
  //循环所有结果集字符串
  for(int i=0;i<tmpStr.size();i++){
   //得到每一条结果集
   String tmpString = tmpStr.get(i).toString();
   //如果A变了 清空sedStr的累加;
   if(!lastStr.equals(tmpString.split(",")[0])) sedStr="";
   //得到每一条结果集 剩余B、C级的字符串
   sedStr += tmpString.split(",")[1]+","+tmpString.split(",")[2]+"@";
   lastStr = tmpString.split(",")[0];
   /**
    * 使用map存放A级键值对,map键不可重复。B、C可能不止1条 于是累加被付给value
    */
   map.put(tmpString.split(",")[0], sedStr.substring(0,sedStr.length()-1));
  }
  //迭代出所有的A级 (即A界Map的key)
  Iterator i = map.keySet().iterator();
  while(i.hasNext()){
   //得到每一个key(A级)
   Object key1 = i.next();
   //可能有一群TmpTree被赋值给treeA
   List sedList = new ArrayList();
   //构建map2 用于从取得的B、C级中过滤出B
   Map map2 = new HashMap();
   //通过A从map中得到B、C,每个A可能附带了一条以上的B、C
   String[] tmpString = ((String)map.get(key1)).split("@");
   //用于累加C的字符串
   String tmpString2 = "";
   //记录最后一次B键值对 用于清空C累加
   String lastStr1 = "";
   for(int j=0;j<tmpString.length;j++){
    //得到所有的C并且累加
    if(!lastStr1.equals(tmpString[j].split(",")[0])) lastStr1="";
    tmpString2 += tmpString[j].split(",")[1] + ",";
    /**
     * 使用map存放B级键值对,map键不可重复。C可能不止1条 于是累加被付给value
     */
    map2.put(tmpString[j].split(",")[0], tmpString2.substring(0, tmpString2.length()-1));
    lastStr1 = tmpString[j].split(",")[0];
   }
   //迭代C级
   Iterator i2 = map2.keySet().iterator();
   while(i2.hasNext()){
    //C级TmpTree集合
    List theList = new ArrayList();
    //其实就是B级键值对
    Object key2 = i2.next();
    //通过B从map中得到C,每个B可能附带了一条以上的C
    String [] tmpString3 = ((String)map2.get(key2)).split(",");
    //循环每条C
    for(int n=0;n<tmpString3.length;n++){
     //构建C对象群..
     TmpTree treeC = new TmpTree();
     treeC.setId(tmpString3[n].split("-")[0]);
     treeC.setName(tmpString3[n].split("-")[1]);
     treeC.setTmpTree(null);
     theList.add(treeC);
    }
    //构建B对象群
    TmpTree treeB = new TmpTree();
    treeB.setId(((String)key2).split("-")[0]);
    treeB.setName(((String)key2).split("-")[1]);
    //将C对象群赋值给B
    treeB.setTmpTree(theList);
    sedList.add(treeB);
   }
   //构建A对象群
   TmpTree treeA = new TmpTree();
   treeA.setId(((String)key1).split("-")[0]);
   treeA.setName(((String)key1).split("-")[1]);
   //将B对象群赋值给A
   treeA.setTmpTree(sedList);
   resultList.add(treeA); // 别忘记解注这里别忘记解注这里别忘记解注这里别忘记解注这里别忘记解注这里别忘记解注这里别忘记解注这里别忘记解注这里别忘记解注这里别忘记解注这里别忘记解注这里别忘记解注这里
   resultList2.add(treeA);
  }
//  String resultStr = this.TestIt(resultList2,false,"");  //测试方法记得删除
//  System.out.print(resultStr);
  return resultList;
 }

 

 

获取并将树递归拼写成需要的格式:

 

@SuppressWarnings("unchecked")
 public String TestIt(List list,Boolean last,String returnStr){
  Iterator iterator = list.iterator();
  
  
  if(last){
   while(iterator.hasNext()){
    TmpTree tt = (TmpTree)iterator.next();
    String flagStr="title";
    if(tt.getTmpTree()!=null&&tt.getTmpTree().size()>0){
     flagStr="first";
    }
    returnStr += "<book "+flagStr+"='"+tt.getName()+"' id='"+tt.getId()+"'>";
    if(tt.getTmpTree()!=null && tt.getTmpTree().iterator().hasNext()){
     returnStr +=TestIt(tt.getTmpTree(),true,"");
    }
    returnStr +="</book>";
   }
  }
  else{
   while(iterator.hasNext()){
    TmpTree tt = (TmpTree)iterator.next();
    returnStr +="<author first='"+tt.getName()+"' id='"+tt.getId()+"'>";
    if(tt.getTmpTree()!=null && tt.getTmpTree().iterator().hasNext()){
     returnStr +=TestIt(tt.getTmpTree(),true,"");
    }
    returnStr +="</author>";
   }
  }
  return returnStr;
 }

 

 

e.g.显示结果:

<author first="北京市" id="00001">

  <book first="朝阳区" id="2301">
      <book title="安定门" id="04001"></book>

      <book title="国贸" id="04007"></book>

      ……

  </book>

</author>