所以我在下面的代码中收到了上面的错误(我的目标是递归地对我的对象进行排序并按区域排列)。
private static void recursionSort(ArrayList<GeometricObject> data)
{
ArrayList<GeometricObject> a = new ArrayList<GeometricObject>(data.size() / 2);
ArrayList<GeometricObject> b = new ArrayList<GeometricObject>(data.size() - a.size()); // Split array into two
// halves, a and b
for(int i = 0; i < data.size(); i++)
{
if(i < a.size())
a.set(i,data.get(i));
else
b.set(i - a.size(),data.get(i));
}
recursionSort(a); // Recursively sort first
recursionSort(b); // and second half.
int ai = 0; // Merge halves: ai, bi
int bi = 0; // track position in
while(ai + bi < data.size()) { // in each half.
if(bi >= b.size() || (ai < a.size() && a.get(ai).getArea() < b.get(bi).getArea())) {
data.set(ai + bi,a.get(ai)); // (copy element of first array over)
ai++;
} else {
data.set(ai + bi,b.get(bi)); // (copy element of second array over)
bi++;
}
}
System.out.println(data);
}
现在令我困惑的是我的索引从0开始(正确吗?)那么为什么我的索引在0大小为0,我列表中的第一个对象(索引0)肯定不是空的?任何帮助或想法?谢谢!
答案 0 :(得分:1)
看看JavaDoc for ArrayList constructor。据说:
构造一个具有指定初始容量的空列表。
现在在ArrayList#size() desctiption:
返回此列表中的元素数。
您获得的异常是由于对这两种方法行为的误解造成的。即使在第一次迭代中,您也可以通过带有initialCapacity的构造函数创建2个ArrayList实例,并且您认为您的ArrayList是使用somethig初始化的,不是。您的列表仍然为空,即使在第一次迭代中,对ArrayList#size()
的调用也会返回0。
使用初始容量来定义内部数组大小,以使您的ArrayList更高效,因为在您的ArrayList增长时,它不必重复重新分配内部数组。它没有用某些东西初始化你的列表,如果你不手动添加它们就不能对元素进行任何操作。
你得到java.lang.IndexOutOfBoundsException
,因为你试图为某个元素调用ArrayList#set(int index, E element)
方法,这个元素不存在(你的列表是空的并且尚未初始化)。
答案 1 :(得分:0)
问题是:您正在重新划分列表,当列表大小变为1时,i.e data.size() = 1
。 data.size() / 2
值变为零。
现在你的ArrayList<GeometricObject> a = new ArrayList<GeometricObject>(data.size() / 2);
大小零。
因此,在Arraylist a
中设置值时,它正在给出
线程“main”中的异常java.lang.IndexOutOfBoundsException:Index: 0,大小:0
递归始终需要一个退出路径,否则会无限期地重复出现。
我想你需要一个基础和终止案例来解决你的问题。
提示:尝试使用某些if else
条件。