【问题标题】:Removing an element from ArrayList while looping over it在循环遍历它时从 ArrayList 中删除一个元素
【发布时间】:2014-04-13 16:17:42
【问题描述】:

我正在尝试遍历一组brickEnemies,如果我的条件为真,那么应该从我的数组中删除砖块。我收到以下错误 IndexOutOfBoundsException。删除元素后如何让 for 循环继续运行?

    int lengthofBrickEnemies = brickEnemies.size();
    for (int i = 0; i < lengthofBrickEnemies; i++) {
        Brick brick = brickEnemies.get(i);
        int newPosition_X = brick.getPositionX() - SPEED;
        if (newPosition_X > 0) {
            brick.setPositionX(newPosition_X);
        } else {
            brickEnemies.remove(i);
        }

    }

【问题讨论】:

  • 不是数组,是数组列表对吧?
  • 是的,Marco 它是一个 ArrayList
  • 您正在循环中更改数组。这意味着它会随着您的循环运行而缩短,并且您的 lengthofBrickEnemies 反映了 OLD 大小。例如一个包含 100 个元素的数组,删除 10 个,你仍然会循环到 100 个,但现在只有 90 个元素,你会跑出数组的末尾。
  • 检查我的答案@Pierre 我使用了相同的代码,但是您在删除时在条件和修改索引方面犯了一些错误

标签: java for-loop arraylist


【解决方案1】:

不是Array,而是ArrayList

要在阅读时从ArrayList 中删除项目,您应该使用Iterator,然后使用Iterator.remove() 方法。

将是:

Iterator<Brick> it = brickEnemies.iterator();
while (it.hasNext()) {
  Brick brick = it.next();
  int newPosition_X = brick.getPositionX() - SPEED;
  if (newPosition_X > 0) {
       brick.setPositionX(newPosition_X);
  } else {
       it.remove();
  }
}

it.remove(); 删除.next() 调用返回的项目。

hasNext() 用于确保在ArrayList 中有更多项要迭代。

从底层集合中删除由返回的最后一个元素 此迭代器(可选操作)。该方法只能调用 每次调用 next() 一次。迭代器的行为是未指定的,如果 迭代进行时基础集合被修改 除了调用此方法之外,以任何方式取得进展。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-22
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 2020-06-02
    相关资源
    最近更新 更多