【发布时间】: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