【问题标题】:QuickSort for ArrayList<Object>ArrayList<Object> 的快速排序
【发布时间】:2012-07-27 04:38:21
【问题描述】:

我的快速排序方法似乎有一些问题。我正在尝试使用我的快速排序方法对对象的 ArrayList 进行排序。我正在使用 Apache POI 库从 excel 文件中提取数据,并将这些数据添加到我的数组列表中。我已经通过在应用快速排序方法之前打印出数组列表来确认我的数组列表不为空。

我的问题似乎是,在传入我的对象数组列表后,它被重置为 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;
    }



}

【问题讨论】:

  • 您实施自己的快速排序是否有原因?
  • 我不知道有一个内置的快速排序功能。无论如何,我觉得编写自己的快速排序将是一种学习体验。此外,由于它是一个对象数组列表,我不确定如何使用内置快速排序,因为我想根据对象中的许多整数值之一对列表进行排序。

标签: java oop sorting arraylist quicksort


【解决方案1】:

如果您使用 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

【讨论】:

  • 我尝试使用它,但在尝试调用 Collections.sort(incom, new IncomComparator()); 时出现了一些错误,我收到错误消息说没有可以访问类型 Test 的封闭实例。必须使用 Test 类型的封闭实例来限定分配(例如 x.new A(),其中 x 是 Test 的实例)。
  • 如果您尝试将 IncomComparator 定义为内部类,请参阅this。或者您可以使用匿名比较器(我将在答案中添加一个示例)。
猜你喜欢
  • 1970-01-01
  • 2021-03-16
  • 2014-06-13
  • 2021-04-29
  • 1970-01-01
  • 2020-08-14
  • 2014-10-10
  • 2016-12-23
  • 1970-01-01
相关资源
最近更新 更多