前段时间遇到一个排序的问题,是对一个数组进行排序,数组中存放的是有级别的对象(已经由Oracle的Connect 进行分级),但是每级内的对象顺序是乱的,下面这个类完成了排序功能 package dsn; 
import java.util.*; import log.*; import model.*; 
public class RequireSorter2 {     Log4jWrapper log = WebLog.getInstance();     private static RequireSorter2 instance = new RequireSorter2();     private RequireSorter2()     {     } 
    public static RequireSorter2 getInstance()     {         return instance;     } 
    public ProductRequire[] sort( ProductRequire[] sourceRequire )     {         log.debug("Begin sort");         long start = System.currentTimeMillis();         if(null==sourceRequire || sourceRequire.length ==0 )         {             return sourceRequire;         } 
        /*构造有序树*/         SorterTreeNode root = new SorterTreeNode( null );         for ( int i = 0; i < sourceRequire.length; i++ )         {             if(null==sourceRequire[ i ])             {                 continue;             }             SorterTreeNode treeNode = new SorterTreeNode( sourceRequire[ i ] );             root.add(treeNode);         } 
        /*将树转为数组*/         sourceRequire = treeToArray(root);         long end = System.currentTimeMillis();         log.debug("Sort count:"+sourceRequire.length);         log.debug("Sort time:"+(end-start));         return  sourceRequire;     } 
    /**      * 使用深度优先遍历树,返回数组      * @param treeNode TreeNode      * @return ProductRequire[]      */     private ProductRequire[] treeToArray(SorterTreeNode treeNode)     {         /*存储从树中取出的节点*/         ArrayList list = new ArrayList();         Stack stack = new Stack();         stack.push(treeNode);         SorterTreeNode parent = null;         SorterTreeNode child = null;         while(!stack.isEmpty())         {             parent = (SorterTreeNode)stack.pop();             /*根节点是null*/             if(null!=parent.getProductRequire())             {                 list.add( parent.getProductRequire() );             }             ArrayList children = parent.getChildren();             for(int i=children.size()-1;i>=0;i--)             {                 stack.push(children.get(i));             }         }         ProductRequire[] productRequire = (ProductRequire[])list.toArray(new ProductRequire[list.size()]);         return productRequire;     } } 
class SorterTreeNode {     /*人造节点*/     public static final String OTHER_LEVEL_REQUIREMENT_NO = "          "; 
    /*父节点*/     private SorterTreeNode parent = null; 
    /*本节点存储的对象*/     private ProductRequire productRequire = null; 
    /*子节点*/     private ArrayList children = new ArrayList(); 
    private int lastChildIndex = -1;     /**      * 私有      */     private SorterTreeNode(ProductRequire[] sourceRequire)     {     }     /**      * 构造函数      */     public SorterTreeNode(ProductRequire productRequire)     {         this.productRequire  = productRequire;     } 
    public SorterTreeNode getParent()     {         return parent;     } 
    public void setParent(SorterTreeNode parent)     {         this.parent = parent;     } 
    public ArrayList getChildren()     {         return children;     } 
    public ProductRequire getProductRequire()     {         return productRequire;     } 
    /**      * 添加节点      */     public void add(SorterTreeNode treeNode)     {         if(lastChildIndex<0            || ((SorterTreeNode)children.get(lastChildIndex)).getProductRequire().getLevelId()==treeNode.getProductRequire().getLevelId())         {             insertChild(treeNode);         }         else         {             ((SorterTreeNode)children.get(lastChildIndex)).add(treeNode);         }     } 
    /**      * 按序插入子节点      * @param productRequire ProductRequire      */     private void insertChild(SorterTreeNode child)     {         child.setParent(this);         ProductRequire productRequire = child.getProductRequire();         ProductRequire tmp = null;         for(int i=0;i<children.size();i++)         {             tmp = ((SorterTreeNode)children.get(i)).getProductRequire();             if(compare(tmp.getRequirementNo(),productRequire.getRequirementNo())>0)             {                 lastChildIndex = i;                 children.add(i,child);                 return;             }         }         children.add(child);         lastChildIndex = children.size()-1;     } 
    public int compare( Object o1, Object o2 )     {         int result = ( ( String )o1 ).compareTo( o2 );         if ( result > 0 && OTHER_LEVEL_REQUIREMENT_NO.equals( o2 ) )         {             result = 0;         }         return result;     } 
    public boolean equals( Object o1 )     {         return true;     } 
 }
 
  
 
  |