【问题标题】:Java for each makes problems [duplicate]每个Java都会产生问题[重复]
【发布时间】:2014-08-09 15:29:06
【问题描述】:

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

使用“正常”的 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。我的问题的不同之处在于,在这种情况下会创建新对象——我现在的问题是当对象被删除(从列表中删除)时如何处理这种情况。

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

【问题讨论】:

  • 问题其实是一模一样的。当您使用 for-each 循环对其进行迭代时,您无法在结构上修改集合。时期。只要您不使用LinkedList,性能很可能是相同的。我还想指出,您的“正常” for 循环有可能跳过元素。另外,你在哪里移除子弹?在draw()?
  • 您可以使用iterator 删除for-each 循环中的元素。这个问题已经回答了stackoverflow.com/questions/6958478/…
  • 阅读ForLoopWorking 以更好地了解如何处理上一节提到的删除场景.....
  • @RaulRene 这仍然会导致ConcurrentModificationException,因为 for-each 循环产生自己的迭代器。您必须使用while 循环或常规for 循环。
  • @MartinPfeffer 是的。那里有足够的信息供人们找出你的问题,但你应该更清楚你得到的错误。阅读“I found THIS here on stackoverflow”不如“I get a ConcurrentModificationException here is my stack trace”有用。您还向我们展示了代码示例,但都没有包含足够的细节来重现问题。

标签: java android loops for-loop foreach


【解决方案1】:

您通常不能在迭代集合时对其进行修改。围绕此的策略通常分为:

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

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

(或者更好的是,使用 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);

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

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

【讨论】:

  • 我采用了您的第一个解决方案(我的代码已经非常重载)并且最小的代码最有可能(目前)..非常感谢,完美运行。
猜你喜欢
  • 2011-11-02
  • 2021-10-11
  • 2015-05-10
  • 2015-06-30
  • 2016-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
相关资源
最近更新 更多