2017-04-04 81 views
0

我有一個程序,我必須在我的comp sci課程中做關於跟蹤cookie命令的事情(想想女孩童子軍餅乾)。這是一種方法,旨在刪除某種cookie,並返回刪除的盒子數量。它一直走出界限。 ArrayList的是「訂單」變量它是由CookieOrder對象(以下CookieOrder類)繼續走出界限ArrayList

public int removeVariety(String cookieVar) 
{ 
    int counter = 0; 
    for(int i = orders.size() - 1; i > 0; i--) 
    { 
     if(orders.get(i).getVariety().equals(cookieVar)) 
     { 
      counter += orders.get(i).getNumBoxes(); 
      orders.remove(i); 
     } 
    } 
    return counter; 
} 

這裏的年代CookieOrder類

private String variety; 
private int boxes; 

public CookieOrder (String variety, int numBoxes) 
{ 
    this.variety = variety; 
    boxes = numBoxes; 
} 

public String getVariety() 
{ 
    return variety; 
} 

public int getNumBoxes() 
{ 
    return boxes; 
} 
+1

什麼行是例外? –

+0

你知道它在哪裏出界嗎,在外部循環還是內部循環?你可以做一個打印語句,包括我在每一個,它應該告訴你在哪裏數組越來越界外例外。 –

回答

2

不要使用for循環,使用迭代器和使用Iterator#remove()

0

試試這個,而不是注意你應該真的使用Iterator,但我認爲你不會在你的課程中覆蓋。 特別注意區別i > 0i >= 0之間

public int removeVariety(String cookieVar) 
{ 
    int counter = 0; 
    for (int i = orders.size() - 1; i >= 0; i--) 
    { 
    CookieOrder o = orders.get(i); 
    if (o.getVariety().equals(cookieVar)) 
    { 
     counter += o.getNumBoxes(); 
     orders.remove(i); 
    } 
    } 
    return counter; 
} 

你在做什麼基本上遍歷以相反的順序列表,以便移除的單元不影響剩餘元素的索引。

替代迭代器基礎的解決方案

如果你好奇這裏是使用一個迭代的解決方案:

public int removeVariety(String cookieVar) 
{ 
    int counter = 0; 
    Iterator iter = orders.iterator(); 

    while (iter.hasNext()) 
    { 
    CookieOrder o = iter.next(); 
    if (o.getVariety().equals(cookieVar)) 
    { 
     counter += o.getNumBoxes(); 
     iter.remove(); 
    } 
    } 
    return counter; 
} 
+0

謝謝。你完全理解我。這個迭代器的東西超越了我,因爲這是我的第一年comp sci,而且我仍然在掙脫出界異常。謝謝你的代碼和解釋。 – brendanw36

1

您初始化for循環變量從orders.size()開始,再往0。但是在循環內部,您刪除了訂單,因此orders.size()會減少,但循環變量i不會注意到它。

最簡單的解決方案是從0循環到orders.size() - 1 - 它將被每次評估,所以它會注意到刪除。

0

問題是你正在修改列表,因爲你正在同時循環它。這是行不通的。如果你只是想總結一些價值,你不需要從列表中刪除該項目。

希望這有助於

+0

沒有抱歉。該方法必須從列表中刪除訂單。這是我的任務的一部分。 – brendanw36

0

如果您使用的是Java 8:

return orders.stream() 
    .filter(ord -> ord.getVarienty().equals(cookieVar)) 
    .peek(orders::remove) 
    .mapToInt(ord -> ord.getNumBoxes()) 
    .sum(); 

或使用迭代器(更迫切的方式):

int c = 0; 
Iterator<CookieOrder> it = orders.iterator(); 
while (it.hasNext()) { 
    CookieOrder current = it.next(); 
    if(current.getVarienty().equals(cookieVar)){ 
     it.remove(); 
     c += current.getNumBoxes(); 
    } 
} 
return c; 

你所試圖做的是要咬你自己的尾巴:)

不要修改你正在處理的集合。