2016-04-23 63 views
1

作爲家庭作業的一部分,我們必須實現合併排序。沒什麼大不了的,我以前做過。這一次,雖然我得到了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) {),但只有代碼在那裏時纔可重現。所以我還是輸了。

這是怎麼回事?我如何解決它?

+0

是否有另一個(併發)線程可以修改此變量?這個問題可以重現嗎? –

+0

沒有併發線程,它是可重複的,但該錯誤在我的方法的後期部分,我現在添加 –

+0

當您調用函數合併時,第一個,中間和最後一個值是什麼? – scoots

回答

0

爲了將來的參考,我的問題是我沒有正確地追蹤控制流。我以爲我留在while循環中,但事實上,我突然出現了,出乎意料的是,清除了ArrayList。 我的解決辦法,以取代在方法的最後兩行:

for (index=first; index <= last; index++) 
     data.set(index, temp.get(index)); 

它現在。

0

這裏的問題不是刪除,而是不加入臨時。請考慮以下情形:

鑑於first1從0開始和last1是您的中段價值5元的情況下,它是2 此外,first2以3開始和last2是你的最後一個索引,數組從0開始它的4 現在,如果first1從0到2(即它在循環內部進入)並且增量達到3,則while循環將結束並且first2將不會被比較,即其他一半被省略。

因此,用while (first1 <= last1 || first2 <= last2)代替while (first1 <= last1 && first2 <= last2)我們用'||'代替''也會跑到另一半。

+0

我明白你的意思,但那不是我的問題。我稍後在程序中複製其餘的東西。 –

+0

如果first1一直增加到2,那麼就沒有什麼可比較的,所以它進入第3個while循環,它將first2遞增,並將剩下的一半放到temp中。 – scoots