2017-04-04 75 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; 

你所试图做的是要咬你自己的尾巴:)

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