我理解这个异常的发生是因为我在迭代一个列表时试图修改一个列表,但是我不知道如何绕过它。
for(Villager e : tasked)
{
if(!e.hasTask())
{
tasked.remove(e);
}
}
代码是很清楚的。如果村民"e“没有任务,则应将其从此列表中删除。
发布于 2014-11-19 22:20:26
使用ListIterator,它允许您对正在迭代的列表进行更改。
您使用的代码是迭代器的在使用中几乎是惰性的,但是必须使用迭代器的remove()
方法显式地删除元素。
例如:
Iterator itr = tasked.iterator();
while(itr.hasNext()) {
Villager e = itr.next();
if(!e.hasTask()) {
itr.remove();
}
}
发布于 2014-11-19 22:25:56
ConcurrentModificationException是一个RuntimeException,如果检测到对象的并发修改是不允许的,这种修改可能会引发这种修改。一个不允许的行为的例子是当一个线程试图修改一个集合的内部结构,而另一个线程正在迭代它。
使用Iterator的删除方法。
Iterator<Village> villageItr = tasked.iterator();
while(villageItr.hasNext()){
Village e=villageItr.next();
if(!e.hasTask()){
//remove that element from collection
villageItr.remove();
}
}
发布于 2014-11-19 22:26:06
创建单独的列表(例如itemsToRemove),其中包含要删除的所有项目,然后使用tasked.removeAll(itemsToRemoveList)
例如:
List<Villager> toRemove = new ArrayList();
for(Villager e : tasked)
{
if(!e.hasTask())
{
toRemove.add(e);
}
}
tasked.removeAll(toRemove);
这种方法的唯一问题是,如果“toRemove”列表大小非常大,则可以执行相反的“ls.retainAll(C)”操作,只需确定要保留的内容。
https://stackoverflow.com/questions/27033028
复制