Java 删除实体,然后在其位置添加新实体

Java 删除实体,然后在其位置添加新实体,java,for-loop,arraylist,Java,For Loop,Arraylist,所以我在做一个僵尸模拟游戏。我现在看到的是一群玩家和僵尸在这一点上随机地跑来跑去。当一个幸存者与一个僵尸相撞时,我希望它移除这个幸存者并用一个僵尸替换它,实质上把他变成一个僵尸 碰撞检测工作得很好(我只是使用awt矩形和intersect方法)。然而,我有一个僵尸阵列列表和一个幸存者阵列列表。当发生碰撞时,我将僵尸添加到僵尸列表中。然后我将幸存者从列表中删除。它工作了几次,然后随机抛出一个索引越界异常 java.lang.IndexOutOfBoundsException: Index: 13,

所以我在做一个僵尸模拟游戏。我现在看到的是一群玩家和僵尸在这一点上随机地跑来跑去。当一个幸存者与一个僵尸相撞时,我希望它移除这个幸存者并用一个僵尸替换它,实质上把他变成一个僵尸

碰撞检测工作得很好(我只是使用awt矩形和intersect方法)。然而,我有一个僵尸阵列列表和一个幸存者阵列列表。当发生碰撞时,我将僵尸添加到僵尸列表中。然后我将幸存者从列表中删除。它工作了几次,然后随机抛出一个索引越界异常

java.lang.IndexOutOfBoundsException: Index: 13, Size: 13
    at java.util.ArrayList.rangeCheck(Unknown Source)
    at java.util.ArrayList.remove(Unknown Source)
    at com.caveragestudios.zombiesim.World.update(World.java:53)
    at com.caveragestudios.zombiesim.Main.update(Main.java:93)
    at com.caveragestudios.zombiesim.Main.run(Main.java:69)
    at java.lang.Thread.run(Unknown Source)
我尝试过使用高级for循环、常规for循环和带有while循环的迭代器。似乎什么都没用。这是我现在的代码

    for (int i = 0; i < survivors.size(); i++) {
        Survivor s = survivors.get(i);
        for (int ii = 0; ii < zombies.size(); ii++) {
            Zombie z = zombies.get(ii);
            if (z.bounds.intersects(s.bounds)) {
                zombies.add(new Zombie(s.position, this));
                survivors.remove(i);
            }
        }
    }
for(int i=0;i

其他一切似乎都正常工作,只是当我试图修改列表时,它有点混乱,并抛出一个索引越界异常。有什么想法吗?

你已经使用了外部列表
幸存者
索引
i
到内部列表
僵尸
。您的索引变量在
僵尸中出错。获取(i)


嗯,我已经设法自己弄明白了。马苏德朝着正确的方向推了一下。问题是在迭代列表时我无法修改列表,但是我仍然需要来自迭代器的数据

我所做的是创建了两个新的列表,其中一个名为toRemove,以填充碰撞幸存者。然后其中一个叫toAdd,里面满是相撞的僵尸

然后像平常一样迭代,但不是直接从主列表中添加和删除,而是将它们添加到那些新列表中。然后在迭代完成后,删除并相应地添加这些新列表。这是最后的代码

    List<Survivor> toRemove = new ArrayList<Survivor>();
    List<Zombie> toAdd = new ArrayList<Zombie>();

    Iterator<Survivor> survIt = survivors.iterator();
    Iterator<Zombie> zombIt = zombies.iterator();
    while (survIt.hasNext()) {
        Survivor s = survIt.next();
        while (zombIt.hasNext()) {
            Zombie z = zombIt.next();
            if (z.bounds.intersects(s.bounds)){
                toAdd.add(new Zombie(s.position, this));
                toRemove.add(s);
                System.out.println("collided");
            }
        }
    }

    for (Survivor s : toRemove) {
        survivors.remove(s);
    }

    for (Zombie z : toAdd) {
        zombies.add(z);
    }
List-toRemove=new-ArrayList();
List toAdd=new ArrayList();
迭代器survIt=survives.Iterator();
迭代器zombIt=zombies.Iterator();
while(survIt.hasNext()){
幸存者s=survIt.next();
while(zombIt.hasNext()){
Zombie z=zombIt.next();
如果(z边界相交(s边界)){
添加(新僵尸(s.position,this));
删除。添加;
System.out.println(“冲突”);
}
}
}
对于(幸存者s:toRemove){
幸存者。移除;
}
用于(僵尸z:toAdd){
僵尸。添加(z);
}

哇,我真不敢相信我错过了,哈哈。不过我改变了它,现在它不再工作几次然后断裂,而是在第一次碰撞时断裂。所以我认为这不是唯一的问题。Darren,使用Iterator.remove从集合中删除元素。但是我不相信你可以用它从列表中删除特定的对象。我必须使用类似while的东西(survives.iterator().hasNext())。然后它就会卡在那里,而不会继续程序的其余部分。我试过了,但我不相信它会起作用。这会引发ConcurrentModificationException。经过研究后发现,你不能在遍历列表时修改它。我想我必须采取一种全新的方法来彻底解决这个问题。
 Iterator<Survivor > survIt=survivors.iterator();     
 Iterator<Zombie> zombIt=zombies.iterator();
 while(survIt.hasNext()){
       Survivor s=survIt.next();    

         while(zombIt.hasNext()){
           Zombie  z=zombIt.next();

            if (z.bounds.intersects(s.bounds)) {
            zombies.add(new Zombie(s.position, this));

            survIt.remove(); //Use Iterator.remove.

            }                 
        }
  }
    List<Survivor> toRemove = new ArrayList<Survivor>();
    List<Zombie> toAdd = new ArrayList<Zombie>();

    Iterator<Survivor> survIt = survivors.iterator();
    Iterator<Zombie> zombIt = zombies.iterator();
    while (survIt.hasNext()) {
        Survivor s = survIt.next();
        while (zombIt.hasNext()) {
            Zombie z = zombIt.next();
            if (z.bounds.intersects(s.bounds)){
                toAdd.add(new Zombie(s.position, this));
                toRemove.add(s);
                System.out.println("collided");
            }
        }
    }

    for (Survivor s : toRemove) {
        survivors.remove(s);
    }

    for (Zombie z : toAdd) {
        zombies.add(z);
    }