作爲家庭作業的一部分,我們必須實現合併排序。沒什麼大不了的,我以前做過。這一次,雖然我得到了IndexOutOfBoundsException
。仍然沒有什麼大不了的,不難解決。有些東西從我的ArrayList中刪除3個元素
但我做一個小挖,我結束了在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));
}
輸出端起來是這樣的:
仍在while循環
[8800,2596,7518,9900,7164]
[8800,2596,7518,9900,7164]
仍處於while循環
[2596,8800]
異常線程 「main」 java.lang.IndexOutOfBoundsException:指數:2,大小:2
那麼,什麼是發生在它循環前的最後一行和while循環中的前兩行之間,從我的ArrayList刪除3個數字。問題是:我無法想象什麼。我沒有刪除while循環中的任何數據;我只是將數據添加到不同的ArrayList。 while條件與ArrayList無關。總之,我迷路了。
這個bug顯然是在方法的後面部分。我仍然不知道發生了什麼,並且IndexOutOfBoundsException
的堆棧跟蹤仍指向while循環中的一行(特別是if (data.get(first1).compareTo(data.get(first2)) < 0) {
),但只有代碼在那裏時纔可重現。所以我還是輸了。
這是怎麼回事?我如何解決它?
是否有另一個(併發)線程可以修改此變量?這個問題可以重現嗎? –
沒有併發線程,它是可重複的,但該錯誤在我的方法的後期部分,我現在添加 –
當您調用函數合併時,第一個,中間和最後一個值是什麼? – scoots