1

我有这个代码:

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

4 回答 4

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);
    }
}
于 2012-11-24T23:22:35.730 回答
3

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

如果您删除一个条目,您的i索引会上升,但是下一个条目也将具有当前i值。

oldcar 1
oldcar 2
oldcar 3

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

于 2012-11-24T23:20:29.033 回答
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();
        }
    }
于 2012-11-24T23:24:01.787 回答
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--);
    }
}
于 2012-11-25T03:16:26.317 回答