首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >ConcurrentModificationException in ArrayList<Object>

ConcurrentModificationException in ArrayList<Object>
EN

Stack Overflow用户
提问于 2014-11-20 06:18:22
回答 4查看 100关注 0票数 1

我理解这个异常的发生是因为我在迭代一个列表时试图修改一个列表,但是我不知道如何绕过它。

代码语言:javascript
代码运行次数:0
运行
复制
    for(Villager e : tasked)
    {
        if(!e.hasTask())
        {
            tasked.remove(e);
        }
    }

代码是很清楚的。如果村民"e“没有任务,则应将其从此列表中删除。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-11-20 06:20:26

使用ListIterator,它允许您对正在迭代的列表进行更改。

您使用的代码是迭代器的在使用中几乎是惰性的,但是必须使用迭代器的remove()方法显式地删除元素。

例如:

代码语言:javascript
代码运行次数:0
运行
复制
    Iterator itr = tasked.iterator(); 
    while(itr.hasNext()) {
        Villager e = itr.next();
        if(!e.hasTask()) {
           itr.remove();
        }
    }
票数 1
EN

Stack Overflow用户

发布于 2014-11-20 06:25:56

ConcurrentModificationException是一个RuntimeException,如果检测到对象的并发修改是不允许的,这种修改可能会引发这种修改。一个不允许的行为的例子是当一个线程试图修改一个集合的内部结构,而另一个线程正在迭代它。

使用Iterator的删除方法。

代码语言:javascript
代码运行次数:0
运行
复制
 Iterator<Village> villageItr = tasked.iterator();
   while(villageItr.hasNext()){
     Village e=villageItr.next(); 
     if(!e.hasTask()){
            //remove that element from collection
            villageItr.remove();
        }

   }
票数 0
EN

Stack Overflow用户

发布于 2014-11-20 06:26:06

创建单独的列表(例如itemsToRemove),其中包含要删除的所有项目,然后使用tasked.removeAll(itemsToRemoveList)

例如:

代码语言:javascript
代码运行次数:0
运行
复制
   List<Villager> toRemove = new ArrayList();
for(Villager e : tasked)
{
    if(!e.hasTask())
    {
        toRemove.add(e);
    }
}
tasked.removeAll(toRemove);

这种方法的唯一问题是,如果“toRemove”列表大小非常大,则可以执行相反的“ls.retainAll(C)”操作,只需确定要保留的内容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27033028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档