作为家庭作业的一部分,我们必须实施合并排序。没什么大不了的,我以前做过。这一次,虽然我得到IndexOutOfBoundsException
。仍然没什么大不了的,不难解决。
但是我做了一点挖掘,最后在我的merge方法的while循环中得到了以下代码:
private static void merge(ArrayList<T> data, int first, int mid, int last) {
ArrayList<T> temp = new ArrayList<T>();
int first1 = first, last1 = mid;
int first2 = mid+1, last2 = last;
int index = first1;
while (first1 <= last1 && first2 <= last2) {
System.out.println("still in while loop");
System.out.println(data);
if (data.get(first1).compareTo(data.get(first2)) < 0) {
temp.add(index, data.get(first1));
first1++;
} else {
temp.add(index, data.get(first2));
first2++;
}
index++;
System.out.println(data);
}
while (first1 <= last1) {
temp.set(index, data.get(first1));
first1++;
index++;
}
while (first2 <= last2) {
temp.set(index, data.get(first2));
first2++;
index++;
}
data.clear();
for (index=first; index <= last; index++)
data.add(index, temp.get(index));
}
输出最终结果如下:
仍在循环中
[8800,2596,7518,9900,7164]
[8800,2596,7518,9900,7164]
仍在循环中
[2596,8800]
线程中的异常&#34; main&#34; java.lang.IndexOutOfBoundsException:Index:2,Size:2
因此,在循环之前的最后一行和while循环中的前两行之间发生了一些事情,它从我的ArrayList中删除了3个数字。问题是:我无法想象。我根本没有删除while循环中的任何数据;我只是将数据添加到不同的ArrayList。 while条件与ArrayList无关。简而言之,我迷失了。
显然,错误出现在方法的后半部分。我仍然不知道该怎么做,IndexOutOfBoundsException
的堆栈跟踪仍然指向while循环中的一行(特别是if (data.get(first1).compareTo(data.get(first2)) < 0) {
),但它是如果该代码存在,则只能重现。所以我还是输了。
这里有什么?我该如何解决?
答案 0 :(得分:0)
为了将来参考,我的问题是我没有正确追踪控制流程。我以为我会在while循环中停留,但实际上,我正在爆发,而data.clear()
令人惊讶的是,清除了ArrayList。
我的解决方案是用以下方法替换方法中的最后两行:
for (index=first; index <= last; index++)
data.set(index, temp.get(index));
现在有效。