我有一个程序,我必须在我的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;
}
答案 0 :(得分:2)
不要使用for
循环,使用迭代器并使用Iterator#remove()
答案 1 :(得分:1)
您将for
循环变量初始化为从orders.size()
开始,然后转到0
。但是在循环中你删除了订单,因此orders.size()
会减少,但循环变量i
不会注意到它。
最简单的解决方案是从0
循环到orders.size() - 1
- 每次都会对其进行评估,因此会注意到删除。
答案 2 :(得分:0)
请尝试相反注意您应该使用Iterator
,但我认为您在课程中还没有涵盖。 请特别注意i > 0
和i >= 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;
你要做的就是在这里咬自己的尾巴:)
请勿修改您当前正在处理的集合。