在迭代时将游戏对象添加到列表

Adding game object to list while iterating over it

我需要将游戏对象添加到列表中。在这个 private ArrayList<GameObject> list; 列表中,我保存了我所有的游戏数据(敌人、方块、砖块等等...)。我是怎么做的

for(GameObject t : list){
    if(Enemy.count < 20){
        list.add(new Enemy(100, 100, true));
    }
}

我得到了这个例外

Exception in thread "LWJGL Application" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
    at java.util.ArrayList$Itr.next(Unknown Source)

这段代码可以重写

   for(GameObject t : list){
        if(Enemy.count < 20){
            list.add(new Enemy(100, 100, true));
        }
    }

作为

if(Enemy.count < 20){
for(int i=0;i<list.size();i++){
            list.add(new Enemy(100, 100, true));
}}

当您尝试在遍历列表的同时修改列表时,您将得到 java.util.ConcurrentModificationException 异常。

-如果目的只是删除对象,请使用迭代器而不是直接遍历它。但是我明白了,你需要添加它们,因此使用第二种方法

Iterator<String> iter = list.iterator();
while (iter.hasNext()) {
    String str = iter.next();
    if (str.equals("B")) {
        iter.remove();
    }
}

-使用 CopyOnWriteArrayList 而不是简单的 ArrayLists,您可以按原样使用现有代码。

List<GameObject> list = new CopyOnWriteArrayList<GameObject()>;
for (GameObject t : list) {
    if (Enemy.count < 20) {
        list.add(new Enemy(100, 100, true));
    }
}

另一个解决方案是临时使用另一个列表:

List<GameObject> toAdd = new ArrayList<>();
for(GameObject t : list){
  if(Enemy.count < 20){
    toAdd.add(new Enemy(100, 100, true));
  }
}
list.addAll(toAdd);