【问题标题】:Java - For loop only runs onceJava - For 循环只运行一次
【发布时间】:2014-04-19 15:01:08
【问题描述】:

我最近问了这个问题:Box2D - Can't destroy multiple fixtures,但发现这不是 Box2D 的问题,而是我的 java.lang.这是我的代码:

public static void removeSpecifiedBodies() {
        for (Body body : bodiesToRemoveList) {
            Array<Fixture> fixtures = body.getFixtureList();
            for (Fixture fixture : fixtures) {
                body.destroyFixture(fixture);
            }
        }
        bodiesToRemoveList.clear();
    }

我正在做的是遍历我的bodyToRemoveList 中的所有body。然后,每个主体都有多个固定装置,所以我得到所有固定装置并循环遍历它们,销毁每个固定装置。在这一切之后,我清除了bodyToRemoveList。但是,在我的第二个 for 循环中,当我销毁灯具时,只有一个被销毁。我做了一些调试,发现for循环只运行一次。我不确定为什么会这样。谷歌搜索显示其他人有这个问题,我注意到他们都从列表中删除或清除了项目,就像我正在做的那样。我认为我的代码没有问题,但由于某种原因,我尝试任何方法都无法修复它。有人看到我的代码有任何问题吗?提前致谢。

编辑:我是个白痴。感谢所有帮助过的人。这是我的代码,如果有人想看的话。

public static void removeSpecifiedBodies() {
            Iterator<Body> i = bodiesToRemoveList.iterator();
            while (i.hasNext()) {
                Body desBod = i.next();
                //body.destroyFixture(fixture);
                WorldController.b2world.destroyBody(desBod);
                i.remove();
            }
        bodiesToRemoveList.clear();
    }

【问题讨论】:

  • bodyToRemoveList 中有多少个身体?
  • For-each 循环在 Java 中没有被破坏。我怀疑destroyFixture() 会修改您正在迭代的列表,从而导致问题。
  • 看起来像这个名称不佳的“Array”类中的一个错误,或者可能在 Fixture 和包含它的 Array 之间存在某种联系。尝试将所有 Fixtures 复制到一个 ArrayList 中,然后循环遍历以销毁它们。

标签: java list for-loop


【解决方案1】:

您不应该修改您正在迭代的列表,除非您直接使用迭代器(并与循环共享它)。由于您无权访问 for 循环正在使用的迭代器,因此您肯定会得到不同的结果。

因此,要么直接使用迭代器,要么另一种方法是将要从列表中删除的所有项目累积到另一个集合中,然后从原始集合中removeAll。由于您要在列表中迭代两次,因此成本会更高一些,但它既简单又干净,对于短列表,可能不是真正的问题。

否则:

List<Fixture> fixtures = body.getFixtureList();
Iterator<Fixture> i = fixtures.iterator();
while(i.hasNext()) {
    Fixture fixture = i.next();
    if (destroyFixture(fixture)) {
        i.remove();
    }
}

【讨论】:

  • 好的,谢谢。我试过这个,但在尝试从迭代器中删除时出错。我在操作中添加了新代码。
  • 没关系。我是个白痴。无需遍历正文列表并使用迭代器。谢谢。 :)
最近更新 更多