继续走出界限ArrayList

时间:2017-04-04 19:26:28

标签: java arraylist

我有一个程序,我必须在我的comp sci课程中,关于跟踪cookie命令(想想女童子军饼干)。这是一种旨在删除某种cookie并返回删除的盒子数量的方法。它一直走出界限。 ArrayList是" orders"变量它由CookieOrder对象(下面的CookieOrder类)组成

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;   
}

5 个答案:

答案 0 :(得分:2)

不要使用for循环,使用迭代器并使用Iterator#remove()

答案 1 :(得分:1)

您将for循环变量初始化为从orders.size()开始,然后转到0。但是在循环中你删除了订单,因此orders.size()会减少,但循环变量i不会注意到它。

最简单的解决方案是从0循环到orders.size() - 1 - 每次都会对其进行评估,因此会注意到删除。

答案 2 :(得分: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;
}

答案 3 :(得分:0)

问题是您正在修改列表,因为您同时循环遍历它。那不行。如果您只想总结一些值,则无需从列表中删除该项。

希望这有帮助

答案 4 :(得分: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;

你要做的就是在这里咬自己的尾巴:)

请勿修改您当前正在处理的集合。