转:用jsp生成树

磁盘文件、XML文档和SQL中的表(有一定要求)都可以生成目录树。     此代码可以任意使用修改,如有修改、建议或发现错误,请发信到flyxxxxx@163.com,谢谢。         import   java.util.ArrayList;     import   java.util.Collections;     import   java.util.Comparator;    
摘要由CSDN通过智能技术生成

磁盘文件、XML文档和SQL中的表(有一定要求)都可以生成目录树。  
  此代码可以任意使用修改,如有修改、建议或发现错误,请发信到flyxxxxx@163.com,谢谢。  
   
  import   java.util.ArrayList;  
  import   java.util.Collections;  
  import   java.util.Comparator;  
  import   java.util.Iterator;  
   
  /**  
    *   目录树.   <br/>  
    *   提供由其它对象生成目录树的支持。<br/>  
    *   如磁盘目录:Tree   t=Tree.getTree(new   java.io.File("D:/"),new   FileContainer());<br/>  
    *   XML文件:Document   doc=...<br/>  
    *   Tree   t=Tree.getTree(doc,new   DocumentContainer());<br/>  
    *   如果有File或Document以外的对象要生成目录树,请实现{@link   TreeNode}或{@link   Container}接口。  
    *   对于SQL中的表,建议字段要求id(标识)、parentId(上级目录标识),其它字段自定,然后对查询到的每一  
    *   条记录生成一个实现TreeNode接口的对象。  
    *   如果实现了TreeNode接口:<br/>  
    *       class   Group   implements   TreeNode{}<br/>  
    *       Group[]   groups=...<br/>  
    *       Tree   t=Tree.getTree(groups,0);//其中0为根结点的ID<br/>,并且groups不要求是同一对象,只要它们都实现了  
    *   接口TreeNode,并且ID不同,这样可以在生成目录树的过程中根据对象类型自行处理。  
    *   <p>Copyright:   Copyright   (c)   2004</p>  
    *   <p>   </p>  
    *   @author   flyxxxxx  
    *   @version   1.0  
    */  
  final   public   class   Tree  
          extends   Node  
  {  
      /**  
        *   结点最大标识  
        */  
      private   static   int   maxId   =   0;  
   
      private   Tree()  
      {  
          super(getMaxId(),   null);  
      }  
   
      private   Tree(int   id)  
      {  
          super(id,   null);  
          maxId   =   id++;  
      }  
   
      private   static   int   getMaxId()  
      {  
          return   maxId++;  
      }  
   
      /**  
        *   创建空目录树.  
        *   @return   Tree   空目录树  
        */  
      public   static   Tree   getTree()  
      {  
          return   new   Tree();  
      }  
   
      /**  
        *   向目录树添加一个结点.  
        *   目录树中所有结点的类型最好是相同的。  
        *   @param   parent   Node   父结点  
        *   @param   value   Object   结点的值  
        *   @return   Node   添加的结点  
        */  
      public   Node   addNode(Node   parent,   Object   value)  
      {  
          Node   rs   =   new   Node(getMaxId(),   parent);  
          rs.setValue(value);  
          return   rs;  
      }  
   
      /**  
        *   创建目录树.  
        *   如果对象实现了接口{@link   Container},可以通过此方法加入目录树。<br/>  
        *   通过此方法创建的目录树,所有结点的ID由系统生成。obj将直接做为根结点,对根结点调用方法  
        *   {@link   Node#getValue()}将得到obj。<br/>  
        *   @param   obj   Object   目录树的根结点  
        *   @param   container   Container   得到对象的子对象的接口  
        *   @return   Tree   目录树  
        */  
      public   static   Tree   getTree(Object   obj,   Container   container)  
      {  
          Tree   rs   =   new   Tree();  
          rs.setValue(obj);  
          Object[]   o   =   container.getChilds(obj);  
          for   (int   i   =   0;   i   <   o.length;   i++)  
          {  
              addNode(rs,   o[i],   container);  
          }  
          return   rs;  
      }  
   
      private   static   void   addNode(Node   n,   Object   obj,   Container   container)  
      {  
          Node   node   =   new   Node(getMaxId(),   n);  
          node.setValue(obj);  
          Object[]   o   =   container.getChilds(obj);  
          for   (int   i   =   0;   i   <   o.length;   i++)  
          {  
              addNode(node,   o[i],   container);  
          }  
      }  
   
      /**  
        *   创建目录树.  
        *   如果对象实现了接口{@link   Container},可以通过此方法加入目录树。<br/>  
        *   通过此方法创建的目录树,所有结点的ID由系统生成,对根结点调用方法{@link   Node#getValue()}  
        *   将得到null。<br/>  
        *   obj数组中的每一个,将直接做为根结点的直接子结点。  
        *   @param   obj   Object   目录树的根结点的直接子结点.  
        *   @param   container   Container   得到对象的子对象的接口  
        *   @return   Tree   目录树  
        */  
      public   static   Tree   getTree(Object   obj[],   Container   container)  
      {  
          Tree   rs   =   new   Tree();  
          for   (int   i   =   0;   i   <   obj.length;   i++)  
          {  
              addNode(rs,   obj[i],   container);  
          }  
          return   rs;  
      }

 /**  
        *   创建目录树.  
        *   只要一组对象实现接口{@link   TreeNode},并且每个对象的ID不同,就可以将它们加入目录树。<br/>  
        *   通过此方法得到的目录树,它的根结点ID值为rootId,其它结点的值为实现接口TreeNode的对象的ID。<br/>  
        *   如果treeNode中包含了根结点,根结点的值可以通过方法{@link   Node#getValue()}得到,返之得到的是null。<br/>  
        *   treeNode可以没有顺序,但父结点的ID一定大于子结点的。  
        *   @param   treeNode   TreeNode[]   构成目录树的结点  
        *   @param   rootId   int   根结点的ID  
        *   @return   Tree   创建目录树  
        */  
      public   static   Tree   getTree(TreeNode[]   treeNode,   int   rootId)  
      {  
          Tree   rs   =   new   Tree(rootId);  
          ArrayList   list   =   new   ArrayList();  
          for   (int   i   =   0;   i   <   treeNode.length;   i++)  
          {  
              list.add(treeNode[i]);  
          }  
          Collections.sort(list,   new   Compare());   //排序  
          Node   last   =   rs;  
          for   (int   i   =   0;   i   <   treeNode.length;   i++)  
          {  
              TreeNode   tnode   =   (TreeNode)   list.get(i);  
              if   (i   ==   0   &&   tnode.getId()   ==   rootId)  
              {   //是否根结点  
                  rs.setValue(tnode);  
              }  
              else  
              {  
                  Node   parent   =   null;   //寻找父结点  
                  if   (   (   (TreeNode)   last.getValue()).getId()   ==   tnode.getParentId())  
                  {  
                      parent   =   last;  
                  }  
                  else  
     

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值