在ArrayList中自己删除对象

时间:2017-12-10 05:22:31

标签: java arraylist slick2d single-threaded

我正在使用单线程游戏,在Main类中我有ArrayList来包含用于攻击僵尸的Bullet对象。 每个游戏框架都像我一样循环:

ArrayList<Bullet> bulletList;
for (Bullet iBullet : bulletList) {
    iBullet.move();
    iBullet.attack(bulletList);
}

在Bullet课程中,我写了

public void attack(ArrayList<Bullet> bulletList) {
    for (Zombies z : zombieList) {
        if ( hit condition ) {
            bulletList.remove(this); //problem here
            return;
        }
    }
}

我在第一次循环后得到null错误,似乎bullet对象已从ArrayList中成功删除,并且还在Main类的循环中造成了一些混乱。

1 个答案:

答案 0 :(得分:2)

您可以使用Iterator,更改attack方法以接受它作为参数:

Iterator<Bullet> iterator = bulletList.iterator();
while (iterator.hasNext()) {
    Bullet iBullet = iterator.next();
    iBullet.move();
    iBullet.attack(bulletList, iterator);
}

public void attack(ArrayList<Bullet> bulletList, Iterator<Bullet> iterator) {
    iterator.remove();
}

或者您可以更改attack方法以返回指示子弹是否命中的布尔值(而不是删除子弹),并使用Java 8中引入的removeIf()方法:

for (Bullet iBullet : bulletList) {
    iBullet.move();
}
bulletList.removeIf(b -> b.attack());