Java为每个人制造问题

Java为每个人制造问题,java,android,loops,for-loop,foreach,Java,Android,Loops,For Loop,Foreach,在我的android项目中,我在使用for-each循环作为列表时遇到了一些麻烦。错误是由迭代器造成的(或者我最好说“错误是由我造成的-不知道如何使用迭代器”^^)。该列表循环使用,以便在画布上绘制项目符号对象。当其中一个子弹离开屏幕时,我删除了这个对象 使用“正常”for循环解决了错误: for (int ii = 0; ii < bulletList_P1.size(); ii++) bulletList_P1.get(ii).draw(canvas);

在我的android项目中,我在使用for-each循环作为列表时遇到了一些麻烦。错误是由迭代器造成的(或者我最好说“错误是由我造成的-不知道如何使用迭代器”^^)。该列表循环使用,以便在画布上绘制项目符号对象。当其中一个子弹离开屏幕时,我删除了这个对象

使用“正常”for循环解决了错误:

for (int ii = 0; ii < bulletList_P1.size(); ii++)
                bulletList_P1.get(ii).draw(canvas);
我在stackoverflow上找到的。与我的问题不同的是,在这种情况下,会创建新对象—我现在的问题是,当对象被删除(从列表中删除)时,如何处理这种情况


使用一种或另一种实现的性能差异有多大?

通常,在对集合进行迭代时,不能修改该集合。围绕这一点的战略通常分为:

一,。复制/克隆原始集合纯粹是为了在其上进行迭代,同时更改原始集合

for (Bullet bullet : new ArrayList<Bullet>(bulletList_P1))
    bullet.draw(canvas);
for(项目符号:新阵列列表(项目符号列表_P1))
子弹画(画布);
(或者更好的是,使用Guava库的ImmutableList.copyOf方法)

二,。在迭代过程中收集您的突变,并有一个单独的阶段来应用这些突变。例如,您可以创建一组在绘制阶段离开屏幕的项目符号。然后使用removeAll删除末尾的错误项目符号

ArrayList<Bullet> removals = new ArrayList<Bullet>();
for (Bullet bullet : bulletList_P1)
    if (!bullet.draw(canvas))
        removals.add(bullet);
bulletList_P1.removeAll(removals);
ArrayList removals=new ArrayList();
用于(项目符号:项目符号列表\u P1)
如果(!bullet.draw(画布))
删除。添加(项目符号);
项目清单1.拆除所有(拆除);
iii.使用迭代器,并在迭代集合时使用迭代器的remove方法修改集合

for (Iterator<Bullet> iterator = bulletList_P1.iterator(); iterator.hasNext(); ) {
    Bullet bullet = iterator.next();
    if (!bullet.draw(canvas))
        iterator.remove();
}
for(Iterator Iterator=bulletList_P1.Iterator();Iterator.hasNext();){
Bullet=iterator.next();
如果(!bullet.draw(画布))
iterator.remove();
}

问题实际上完全相同。在使用for-each循环对集合进行迭代时,不能从结构上修改集合。时期只要您不使用
链接列表
,性能可能是相同的。我还想指出,您的“正常”for循环有可能跳过元素。另外,你在哪里取下子弹?在
draw()
?可以使用
迭代器为每个
循环删除
中的元素。为了更好地理解如何处理问题最后一节中提到的删除场景,已经回答了这个问题。…@RaulRene仍然会导致
ConcurrentModificationException
,因为for-each循环生成自己的迭代器。您必须使用
while
循环或常规
for
循环。@MartinPfeffer-Yes。那里有足够的信息让人们了解你的问题,但是你应该更清楚你所犯的错误。阅读“我在stackoverflow上找到了这里”不如“我得到了一个
ConcurrentModificationException
这是我的堆栈跟踪”。您还向我们展示了代码示例,但都没有包含足够的细节来重现问题。我采用了您的第一个解决方案(我的代码已经超载),最小的代码最有可能(目前)。。非常感谢,非常好用。
for (Iterator<Bullet> iterator = bulletList_P1.iterator(); iterator.hasNext(); ) {
    Bullet bullet = iterator.next();
    if (!bullet.draw(canvas))
        iterator.remove();
}