【问题标题】:Using remove on a list inside a for each loop inside a while loop在 while 循环内的 for each 循环内的列表上使用 remove
【发布时间】:2019-05-19 22:34:17
【问题描述】:

我有一个任务是创建一个比赛模拟器。我有 8 个对象存储在一个列表中。我需要查看其中一个对象何时越过终点线并将它们从列表中删除并将它们放入另一个列表中。为此,我使用了 for each 循环。每次迈出一步时,我都需要执行此检查,因此,foreachloop 位于 while 循环内。当每个人都越过终点线时,while 循环将停止并结束比赛。

while (lista.size()>0) {
        for (RaceTurtle raceTurtle : lista) {
            raceTurtle.raceStep();
            if(raceTurtle.getX() > RaceWindow.X_END_POS) {
                lista.remove(raceTurtle);
                winners.add(raceTurtle);
            }
            w.delay(10);
        }
    }

我曾尝试使用迭代器,但它只会抛出同样的错误。我也尝试使用原始列表的副本,但这似乎不起作用,因为它在 while 循环中。

如果有人能给我一个如何做到这一点的例子,我将不胜感激。

用迭代器再次尝试,这次成功了。

while (lista.size()>0) {
        for (Iterator<RaceTurtle> iterator = lista.iterator(); iterator.hasNext();) {
            RaceTurtle temp = iterator.next();
            temp.raceStep();
            if (temp.getX()> RaceWindow.X_END_POS) {
                winners.add(temp);
                iterator.remove();
            }
        }
        w.delay(50);
    }

【问题讨论】:

标签: java


【解决方案1】:

如果你得到一个ArrayIndexOutOfBoundsException 或类似的东西,如果列表为空,请考虑打破for 循环内的while 循环。例如:

outer: // label the loop
while (lista.size()>0) {
    for (RaceTurtle raceTurtle : lista) {
        raceTurtle.raceStep();
        if(raceTurtle.getX() > RaceWindow.X_END_POS) {
            lista.remove(raceTurtle);
            winners.add(raceTurtle);
        }
        if (lista.size()>0) {
            break outer; // end the outer loop, preventing
                         // the possible iteration of nothing
        }
        w.delay(10);
    }
}

【讨论】:

  • 感谢您的快速回答,但这为我解决了问题:
  • while (lista.size()>0) { for (Iterator iterator = lista.iterator(); iterator.hasNext();) { RaceTurtle temp = iterator.next(); temp.raceStep(); if (temp.getX()> RaceWindow.X_END_POS) { 获胜者.add(temp);迭代器.remove(); } } w.delay(50); }
  • 不能在cmets中格式化代码吗?在原始帖子中添加解决方案。
猜你喜欢
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 2018-11-05
  • 2019-11-10
  • 2014-03-22
  • 1970-01-01
  • 2014-03-15
  • 1970-01-01
相关资源
最近更新 更多