Java 游戏的每一次迭代我都想让它的生命周期减少1

Java 游戏的每一次迭代我都想让它的生命周期减少1,java,object,arraylist,Java,Object,Arraylist,所以我有一个arraylist,它存储关于宇宙的不同物体(行星、彗星、恒星等)。而不是这样做: planet.decreaseLifeTime(1); star.decreaseLifeTime(1); comet.decreaseLifeTime(1); 游戏的每一次迭代我都想让它的生命周期减少1。我试过这个,但不起作用: private ArrayList<SpaceObject> universeEntities; public void reduceLifeTime()

所以我有一个arraylist,它存储关于宇宙的不同物体(行星、彗星、恒星等)。而不是这样做:

planet.decreaseLifeTime(1);
star.decreaseLifeTime(1);
comet.decreaseLifeTime(1);
游戏的每一次迭代我都想让它的生命周期减少1。我试过这个,但不起作用:

private ArrayList<SpaceObject> universeEntities;

public void reduceLifeTime() {
    for (SpaceObject entity: universeEntities) {
        entity.decreaseLifeTime(1);
        if(entity.getLifeTime() <= 0) {
            erase(entity);
            System.out.println("This entity has been erased");
        }

        System.out.println("life time: " + entity.getLifeTime());
    }
}
如果
erase(entity)
正在修改universeEntities列表,java会发疯

您可以将要擦除的SpaceObject存储在单独的列表中,然后在for循环后将其擦除

您可以在universeEntities上循环,而无需使用迭代器
e、 g.数字索引

根据您对
reduceLifeTime
方法的实现,问题可能在于调用其中的
erase
方法(取决于如何实现)

如果
erase
方法只是试图通过调用ArrayList的方法从
universeEntities
集合中删除一个项,那么它只是破坏了一个迭代器

考虑重新实现您的方法以:

public void reduceLifeTime() {
    Iterator<SpaceObject> iterator = universeEntities.iterator();
    while (iterator.hasNext()) {
        SpaceObject object = iterator.next();
        object.decreaseLifeTime(1);

        if(object.getLifeTime() <= 0) {
            iterator.remove();
            System.out.println("This entity has been erased.");
        }

        System.out.println(String.format("Life time: %d", object.getLifeTime()));
    }
}
public void reduceLifeTime(){
迭代器迭代器=universeEntities.Iterator();
while(iterator.hasNext()){
SpaceObject object=iterator.next();
对象。寿命递减(1);

如果(object.getLifeTime(),你的问题是什么?行
擦除(实体)
是否更改
universeEntities
列表?用一个循环围绕它显示完整的代码,而不是“完整的代码”,但这是我开始编程时犯的一个错误,我仍然偶尔会忘记删除某个项会扰乱迭代周期。但请详细说明他执行擦除的方式有什么问题,以及到底是什么让Java对此感到“疯狂”。根据Java API文档[API 2014]如果在迭代过程中修改了基础集合,则未指定迭代器的行为。这在删除迭代器当前指向的项时尤为重要。几乎每个iterable的实现都会遇到此问题。
public void reduceLifeTime() {
    Iterator<SpaceObject> iterator = universeEntities.iterator();
    while (iterator.hasNext()) {
        SpaceObject object = iterator.next();
        object.decreaseLifeTime(1);

        if(object.getLifeTime() <= 0) {
            iterator.remove();
            System.out.println("This entity has been erased.");
        }

        System.out.println(String.format("Life time: %d", object.getLifeTime()));
    }
}
public class Test {
    private ArrayList<SpaceObject> universeEntities = new ArrayList<SpaceObject>();

    public Test() {
        universeEntities.add(new Planet());
        universeEntities.add(new Planet());
    }

    public void reduceLifeTime() {
        Iterator<SpaceObject> iterator = universeEntities.iterator();
        while (iterator.hasNext()) {
            SpaceObject object = iterator.next();
            object.decreaseLifeTime(1);

            if(object.getLifeTime() <= 0) {
                iterator.remove();
                System.out.println("This entity has been erased.");
            }

            System.out.println(String.format("Life time: %d", object.getLifeTime()));
        }
    }

    public static void main(String[] args) {
        Test test = new Test();

        while(true) {
            test.reduceLifeTime();
            // Endless loop. Need a quit condition.
        }
    }

    public static class SpaceObject {
        protected int life = 0;

        public SpaceObject(int life) {
            this.life = life;
        }

        public void decreaseLifeTime(int value) {
            this.life -= value;
        }

        public int getLifeTime() {
            return life;
        }
    }

    public static class Planet extends SpaceObject {
        public Planet() {
            super(10);
        }
    }
}