我在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。我的问题的不同之处在于,在这种情况下会创建新对象 - 我现在的问题是如何在删除对象(从列表中删除)时处理这种情况。
使用一个或另一个实现的性能差异有多大?
答案 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();
}