2013-10-08 32 views
1

這是我的一個家庭作業問題的一部分。strandSort作業,迭代器問題?

我們分別給予strandsort以下僞代碼:

define strandSort(L) 
     result = [] 
     while len(L) > 0 
     inorder = [] 
     remove first element of L, add it to inorder 
     for each item i in L: 
      if i >= last item in inorder 
      remove i from L, add it to inorder 
     result = merge(inorder,result) 
     return result 

我實現了代碼的程序如下:

public List<Integer> strandSort(List<Integer> nums) { 
    List<Integer> result = new ArrayList<Integer>(); 
    while(nums.size() > 0){ 
     List<Integer> inorder = new ArrayList<Integer>(); 
     int toAdd = nums.remove(0); 
     inorder.add(toAdd); 
     for(Integer i : nums){ 
      if (i >= inorder.get(0)){ 
       toAdd = nums.remove((int)i); 
       inorder.add(toAdd); 
      } 
     } 
     result = merge(inorder, result); 
    } 
    return result; 

不過,我碰到一個出界錯誤的「 for(Integer i:nums)「行。我相信我明白爲什麼會發生這種情況。我試圖遍歷列表,同時從中刪除元素。

我不確定的是如何解決它。如果我正確實現了僞代碼,我不相信它會遇到像這樣的錯誤。因此,我認爲我沒有正確實施它。

如果我有,在不破壞輸入列表的情況下重寫strandSort代碼的最佳方法是什麼?

(我很抱歉雙張貼,我不小心提交問題之前,我解釋完了!)

+0

你確定這個異常不在'nums.remove((int)i)'行嗎?如果你不把'(int)'強制轉換,它還會發生嗎?我問的原因是有兩個版本的'remove'方法 - 一個是傳遞想要移除的實際東西,另一個是傳遞'int'的另一個方法,指定列表中要移除的東西的位置很顯然,你想要前者;但是通過指定參數是一個'int',你可能會得到'remove'方法的錯誤版本。 –

+0

我在你的重複帖子中說過的同一件事 - 請不要這樣做,而是編輯你的問題。你不能在'for'循環中得到這個異常,因爲我之前說過,它在你的'remove'中。 –

+0

編譯告訴我這是for循環行,但我意識到,當我從列表中刪除問題真正開始的元素時。 如果我刪除int cast,程序將不會編譯,因爲remove()會返回一個布爾值。 – user2860419

回答

0

toAdd = nums.remove((int)i);是您的罪魁禍首。

JavaDoc

e卸下(INT指數) 移除此列表(可選操作)中指定位置的元件。

boolean remove(Object o) 從列表中刪除指定元素的第一次出現(如果存在)(可選操作)。

它,因爲你投Integerint,造成remove()的第一個版本被稱爲是混亂。這會導致您的代碼刪除元素i而不是i本身。嘗試擺脫明確(int)演員。

+0

*第一個版本的remove()被調用。 – GGrec

+0

更正。感謝您指出這一點,@GGrec – bstempi

0
if (i >= inorder.get(0)){ 

是不一樣的

if i >= last item in inorder 

在你得到的第一個,不是最後一個尚屬首例。