将游戏对象添加到列表中同时迭代它
问题描述:
我需要将游戏对象添加到列表中。在这张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)
答
另一种解决方案是临时使用另一个列表:
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));
}
}
你不能修改阵列whhile你通过它itterating,解决方案之一是每次当你通过它循环的时候,是创建副本。显示更多的代码,然后我们可以制定出适当的解决方案 – user902383 2015-03-13 10:27:00
但是创建副本听起来像是浪费资源 – user2865835 2015-03-13 10:30:09
实际上你在迭代时是否在做任何事情,或者在你提供的代码中是否缺少一些行? – SimonPJ 2015-03-13 10:32:25