每个Java都会产生问题

时间:2014-06-19 07:09:35

标签: java android loops for-loop foreach

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

使用“普通”for循环解决了错误:

for (int ii = 0; ii < bulletList_P1.size(); ii++)
                bulletList_P1.get(ii).draw(canvas);

这种实现会带来错误:

for (Bullet bullet : bulletList_P1)
                bullet.draw(canvas);

我在stackoverflow上找到THIS。我的问题的不同之处在于,在这种情况下会创建新对象 - 我现在的问题是如何在删除对象(从列表中删除)时处理这种情况。

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

1 个答案:

答案 0 :(得分:1)

在迭代它时,通常无法修改集合。围绕这个的策略通常属于:

我。复制/克隆原始集合纯粹是为了迭代它,同时更改原始集合。

for (Bullet bullet : new ArrayList<Bullet>(bulletList_P1))
    bullet.draw(canvas);

(或者更好的是,使用Guava库的ImmutableList.copyOf方法)

II。在迭代过程中收集您的突变,并有一个单独的阶段来应用突变。对于您的示例,您可能会创建一组在绘制阶段离开屏幕的项目符号。然后使用removeAll删除最后的错误子弹。

ArrayList<Bullet> removals = new ArrayList<Bullet>();
for (Bullet bullet : bulletList_P1)
    if (!bullet.draw(canvas))
        removals.add(bullet);
bulletList_P1.removeAll(removals);

III。使用迭代器并使用迭代器的remove方法在迭代时修改集合。

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