2013-11-14 47 views
-1

我應該編寫一個遞歸方法來刪除arrayList結尾的數字的重現。我覺得我已經覆蓋了所有可能出現的錯誤,但是第三次​​處理時出現了界限錯誤。我似乎無法弄清楚爲什麼我會遇到越界錯誤。好像我所有的計數都停留在正確的位置上,並且一旦計數器位置相等,我就有一個使用遞歸的if語句,這就是我認爲錯誤消息的地方。一些成功處理後遞歸方法出界錯誤

任何見解都會有幫助,需要從我的錯誤中學習。遞歸也不是我的強項。

編輯:這是列表; [100,200,200,300,400,300,100,500,500,400,100,400,100,100]

public static void deleteDuplicateValues(ArrayList<Integer> list, int decreasingCounter, int searchingVal, int outsideCounter) 
    { 
    int searchingValue = list.get(searchingVal); 


    if (outsideCounter < (list.size()-1)) 
    { 

     if (searchingValue == list.get(list.size()-1-decreasingCounter)) //finds 
     { 
     System.out.print (searchingValue + " FOUND at position" + (list.size()-1-decreasingCounter) + "\n"); 
     list.remove(list.size()-1-decreasingCounter); 

     deleteDuplicateValues(list, decreasingCounter,searchingVal+1, outsideCounter+1); 

     } 
     else 
     { 
     if (list.size()-1-decreasingCounter == outsideCounter) //gets to end without finding double 
     {//After searching x amount of times, they will equal eachother if not found. 
      //outsideCounter only increments when found or end of processing. 
      decreasingCounter = 0; 
      deleteDuplicateValues(list, decreasingCounter,searchingVal+1, outsideCounter+1); //goes to next position 
     } 

     else 
     { 
      System.out.print("executed"); 
      deleteDuplicateValues(list, decreasingCounter+1, searchingVal, outsideCounter); //values UP1 


     } 
     } 
    } 
+0

這個功課/你是否需要使用遞歸? – turbo

+0

是的不幸。循環會更容易。 – user90000000009

+0

謝謝渦輪。非常有用的鏈接,但也很好奇爲什麼我的代碼無法正常工作。 – user90000000009

回答

0

難道我讓你錯了,或者你想刪除重複?如果是這樣的話,爲什麼不使用java.util.Set的任何實現?

Set<Integer> set = new HashSet<Integer>(list); 
list.clear(); 
list.addAll(set); 

我不能完全理解什麼是所有有關索引和計數

編輯: 我覺得我得到它。當你的if語句

if (searchingValue == list.get(list.size() - 1 - decreasingCounter)) { 
    System.out.print(searchingValue + " FOUND at position" + (list.size() - 1 - decreasingCounter) + "\n"); 
    list.remove(list.size() - 1 - decreasingCounter); 

    deleteDuplicateValues(list, decreasingCounter, searchingVal + 1, outsideCounter + 1); <<-- HERE! 
} 

得到了這一點,你刪除一個元素,即使如此,當你做遞歸調用,您增加serachingValue,但是,你已經移動,通過移除元素。我是否清楚自己?

+0

得到它的工作,只需要添加一個if語句來停止遞歸如果outsiderCounter == list.size() - 1-1。謝謝你們的幫助,感謝你們。 – user90000000009

+0

非常感謝,感謝您的時間! – user90000000009

0

您可以簡化您的不變量。所有你需要的方法參數是一個整數列表和你正在移除的數字的值,只有兩個參數。我不明白爲什麼你需要所有其他人 - 嘗試簡化它,你會破解它。