Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
并发修改异常java,我不认为我可以在这里使用迭代器?_Java_Exception_Concurrentmodification - Fatal编程技术网

并发修改异常java,我不认为我可以在这里使用迭代器?

并发修改异常java,我不认为我可以在这里使用迭代器?,java,exception,concurrentmodification,Java,Exception,Concurrentmodification,我有一个列表,我需要迭代和删除某些项目。我不能使用迭代器,因为我需要为每个不能使用迭代器的项(例如ls.getStatus())调用方法。如果ls.getStatus()==0我需要删除该项。如何避免出现ConcurrentModificationException for (MyList ls : list) { if (ls.getStatus() == 0) { ls.run(); list.remove(); } else {

我有一个列表,我需要迭代和删除某些项目。我不能使用迭代器,因为我需要为每个不能使用迭代器的项(例如
ls.getStatus()
)调用方法。如果
ls.getStatus()==0
我需要删除该项。如何避免出现
ConcurrentModificationException

for (MyList ls : list) {
    if (ls.getStatus() == 0) {
        ls.run();
        list.remove();
    } else {
        ls.create();
    }
}

谢谢

您可以使用迭代器,但必须放弃增强的for循环:

for (Iterator<MyList> iterator = list.iterator(); iterator.hasNext(); ) {
    MyList ls = iterator.next();
    if (ls.getStatus() == 0) {
        lo.run(zo);
        iterator.remove();
    } else {
        ls.create();
    }
}
for(Iterator Iterator=list.Iterator();Iterator.hasNext();){ MyList ls=iterator.next(); 如果(ls.getStatus()==0){ lo.run(zo); iterator.remove(); }否则{ ls.create(); } }
当然,这假设
list
引用了一个支持删除操作的类型。

为什么您不认为可以使用迭代器呢

Iterator<MyList> i = list.iterator();
while (i.hasNext()) {
    MyList ls = i.next();

    //... all your other code which uses ls...

    i.remove();
}
Iterator i=list.Iterator();
while(i.hasNext()){
MyList ls=i.next();
//…所有其他使用ls的代码。。。
i、 删除();
}

这种方法也可能更快,因为使用
iterator.remove()
可以避免在列表中搜索
list.remove(item)
所需的项。如果您的迭代器不支持删除操作,您可以使用以下算法:


在第一步中,您可以遍历列表,创建要删除的元素的索引列表。下一步是向后迭代索引列表并按索引删除元素。

为什么在使用迭代器时不能调用项上的方法?实际上,您是在内部使用迭代器。(MyList ls:list)的行在内部使用列表迭代器进行迭代。如果ls是列表中的对象,我会收到一条错误消息,说我无法从对象类(如ls.getStatus?@user1212520:)调用方法,因为您没有使用泛型迭代器。参见上面的dty示例。但是你的基本假设——你不能使用迭代器——是错误的。问题是删除操作会使迭代器无效。@Trismegistos:它在哪里说,调用
remove
会使迭代器无效?“从基础集合中删除此迭代器返回的最后一个元素(可选操作)。每次调用next(),只能调用一次此方法。”(emphasis mine)清楚地表明,remove的设计目的是在迭代期间调用,而不会使迭代器无效。@Dirk,如果它是根据文档实现的。我知道自定义列表(MyList是)虽然应该这样实现,但它可能没有这样实现。它还可以引发不支持操作异常。