2012-07-29 76 views
1

我似乎在使用我的快速排序方法时遇到了一些问题。我正在尝试使用我的快速排序方法对对象的ArrayList进行排序。我正在使用Apache POI库从excel文件中提取数据,并将此数据添加到我的数组列表中。我已确认,在应用快速排序方法之前,通过打印阵列列表,我的数组列表不是空的。ArrayList的快速排序<Object>

我的问题似乎是,在传递对象的数组列表后,它被重置为null,并且数组列表的大小变为0.在尝试从数组列表中获取对象时,我在快速排序方法中收到了一个java IndexOutOfBounds异常。任何帮助将不胜感激,谢谢!

这里是我的主类:

编辑我用下面给出的解决方案解决了我的问题,但我仍然不明白为什么我的快速排序功能不起作用。如果有人可以查看快速排序功能并告诉我哪里出错,我将不胜感激。谢谢 !

public class Test { 


private static ArrayList<Object> incom = new ArrayList<Object>(); 


private static int period; 
private static String termination = "yes"; 
private static int pivotVal; 

private static ArrayList<String> treatment_name = new ArrayList(); 
private static ArrayList<Integer> treatment_cstart = new ArrayList(); 
private static ArrayList<Integer> treatment_cend = new ArrayList(); 
private static ArrayList<Integer> treatment_cost = new ArrayList(); 
private static ArrayList<Integer> bridge_part = new ArrayList(); 
private static ArrayList<Integer> budget = new ArrayList(); 

private static Scanner input = new Scanner(System.in); 
private static Scanner alt = new Scanner(System.in).useDelimiter("\n"); 

public static void main(String[] args) 
{ 

    processFile(); 


} 

public static void processFile(){ 
    try { 
     POIFSFileSystem fs  = 
      new POIFSFileSystem(new FileInputStream("Book2.xls")); 
     HSSFWorkbook wb = new HSSFWorkbook(fs); 

     HSSFSheet sheet =wb.getSheet("Table0"); 
     RowProcessor ip = IncomeProcessor.getInstance(); 
     Object [] incomes = ip.process(sheet); 

     for (int i=0; i<incomes.length; i++) 
      incom.add(incomes[i]); 

     for (int i=0; i<incom.size(); i++) 
     { 
      Income income = (Income)incom.get(i); 
      System.out.println(income.getBridgeID() + " " + income.getDeckState()); 
     } 


      incom = quicksort(incom); 

    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 



public static ArrayList<Object> quicksort(ArrayList<Object> income){ 

    int pivot = income.size()/2; 
    int samePivotVal = 0; 
    ArrayList<Object> greater = new ArrayList<Object>(); 
    ArrayList<Object> lesser = new ArrayList<Object>(); 

    Income pivotIncome = (Income) income.get(pivot); 
    pivotVal = pivotIncome.getDeckState(); 

    Income in; 
    for(int i=0; i<income.size() ;i++){ 
     in = (Income)income.get(i); 
     if(in.getDeckState() > pivotVal) 
      greater.add(in); 
     else if(in.getDeckState() < pivotVal) 
      lesser.add(in); 
     else 
      samePivotVal++; 
    } 


    lesser = quicksort(lesser); 
    for(int i=0; i<samePivotVal; i++) 
     lesser.add(pivotIncome); 

    greater = quicksort(greater); 

    ArrayList<Object> sorted = new ArrayList<Object>(); 

    for(Object result : lesser) 
     sorted.add(result); 

    for(Object result : greater) 
     sorted.add(result); 

    return sorted; 
    } 



} 
+0

你是否有理由实施自己的quicksort? – Vatev 2012-07-29 00:48:54

+0

我不知道有一个内置的快速排序功能。无论如何,我觉得这是一个学习经验,写我自己的quicksort。此外,因为它的对象的arraylist我不知道如何我可以使用内置快速排序,因为我想根据对象中的许多整数值之一排序我的列表。 – AndroidDev93 2012-07-29 00:57:41

回答

5

这将是一个更容易(更好),如果你使用Java的内置的排序方法。

public static void processFile(){ 
    //... 

    Collections.sort(incom, new IncomComparator()); 
    //... 
} 


class IncomComparator implements Comparator<Object> { 
    @Override 
    public int compare(Object o1, Object o2) { 
     /* compare logic goes here 
      return a negative number when o1 < o2 
        a positive number when o1 > o2 
        0 when o1 == o2 
     */ 
     return 0; 
    } 

} 

或以更简单的方式

public static void processFile(){ 
    //... 

    Collections.sort(incom, new Comparator<Object>() { 
     @Override 
     public int compare(Object o1, Object o2) { 
      /* compare logic goes here 
       return a negative number when o1 < o2 
        a positive number when o1 > o2 
        0 when o1 == o2 
      */ 
      return 0; 
     } 
    }); 
    //... 
} 

你可以看到更多的例子here

+0

我试过使用它,当试图调用Collections.sort(incom,new IncomComparator())时,我得到了一些错误,;我得到错误说没有封闭类型为Test的实例可以访问。必须使用封闭的Test类型实例来限定分配(例如x.new A(),其中x是Test的一个实例)。 – AndroidDev93 2012-07-29 01:45:31

+0

如果您试图将IncomComparator定义为内部类,请参见[this](http://tinyurl.com/d5yymof)。或者你可以使用匿名比较器(我会给答案添加一个例子)。 – Vatev 2012-07-29 02:00:43

+0

谢谢,这工作! – AndroidDev93 2012-07-29 03:28:42