所以我在下面的代码中收到了上面的错误(我的目标是递归地对我的对象进行排序,并按区域排列它们)。
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)肯定不是空的?有什么帮助或想法吗?谢谢!
发布于 2015-10-14 15:28:46
看看JavaDoc for ArrayList constructor吧。据说:
会构造一个具有指定初始容量的空列表。
现在来看看ArrayList#size()的描述:
返回此列表中的元素数。
你得到的异常是由于对这两种方法行为的误解造成的。甚至在你的第一次迭代中,你用initialCapacity通过构造函数创建了2个ArrayList实例,你假设你的ArrayList是用某个东西初始化的,但是没有。您的列表仍然是空的,即使在第一次迭代中,调用ArrayList#size()也会返回0。
使用初始容量来定义内部数组大小,以使您的ArrayList更有效,因为在ArrayList增长时,它不必重复重新分配内部数组。它不会用某些东西初始化你的列表,如果你不手动添加元素,你就不能对元素进行任何操作。
您之所以获得java.lang.IndexOutOfBoundsException,是因为您试图为一些不存在的元素调用ArrayList#set(int index, E element)方法(您的列表为空且尚未初始化)。
发布于 2015-10-14 14:38:16
问题是:你正在隐蔽地划分列表,当列表的大小变成1时,就是i.e data.size() = 1。零值将变为 data.size() / 2 。
现在你的ArrayList<GeometricObject> a = new ArrayList<GeometricObject>(data.size() / 2);的大小是零。
因此,在Arraylist a中设置该值时,它会给出
线程“main”中出现
异常java.lang.IndexOutOfBoundsException:索引: 0,大小:0
递归总是需要一个退出路径,否则它将无限地循环。
我猜你需要一个基础和终止案例来解决你的问题。提示:尝试使用一些if else条件。
https://stackoverflow.com/questions/33117208
复制相似问题