将游戏对象添加到列表中同时迭代它

问题描述:

我需要将游戏对象添加到列表中。在这张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) 
+2

你不能修改阵列whhile你通过它itterating,解决方案之一是每次当你通过它循环的时候,是创建副本。显示更多的代码,然后我们可以制定出适当的解决方案 – user902383 2015-03-13 10:27:00

+0

但是创建副本听起来像是浪费资源 – user2865835 2015-03-13 10:30:09

+0

实际上你在迭代时是否在做任何事情,或者在你提供的代码中是否缺少一些行? – SimonPJ 2015-03-13 10:32:25

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

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

这个代码可以rewrtitten

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,而不是简单的ArrayList,您可以使用你现有的代码不变。

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