我可以在迭代时从列表中删除吗?

时间:2012-11-24 23:17:51

标签: java

我有这段代码:

for(int i = 0; i < oldCars.size(); ++i)
    {
        if(oldCars.get(i).getVelocity().length() > 0.0f)
        {
            oldCars.get(i).update(timeStep);
        }
        else
        {
            oldCars.remove(i);
        }
    }

它似乎工作正常,但它会在所有条件下工作吗?

由于

4 个答案:

答案 0 :(得分:10)

如果要在迭代时删除,请从结尾开始:

for(int i = oldCars.size() - 1; i >= 0; i--)
{
    if(oldCars.get(i).getVelocity().length() > 0.0f)
    {
        oldCars.get(i).update(timeStep);
    }
    else
    {
        oldCars.remove(i);
    }
}

答案 1 :(得分:3)

我想它不会更新所有条目。

如果删除条目,i索引会上升,但下一项也会有当前i值。

oldcar 1
oldcar 2
oldcar 3

删除“oldcar 1”我将为1,您检查的下一个条目是“oldcar 3”而不是“oldcar 2”。

答案 2 :(得分:2)

   Iterator<T> it = oldCars.iterator();

    while (it.hasNext()) {
        T oldCar = it.next();
        if (oldCar.getVelocity().length() > 0.0f) {
            oldCar.update(timeStep);
        } else {
            it.remove();
        }
    }

答案 3 :(得分:1)

您可以使用您的方法,但稍微修改一下。当您从列表中删除项目时,下一个项目将被跳过,因此每次删除项目时都必须递减i。那么,您将拥有以下内容:

for(int i = 0; i < oldCars.size(); ++i)
{
    if(oldCars.get(i).getVelocity().length() > 0.0f)
    {
        oldCars.get(i).update(timeStep);
    }
    else
    {
        oldCars.remove(i--);
    }
}