当前位置: 首页 > 知识库问答 >
问题:

尝试从ArrayList中删除项时出现ConcurrentModificationException[重复]

诸新霁
2023-03-14

实际上,在按下一个按钮后,我有一个方法可以检查itemStorico ArrayList中是否存在从itemModel添加的新项,然后如果该项存在于名为itemModel的新列表中,我将从itemStorico中删除旧项并添加新项,否则只添加新项而不删除旧项。

但我得到以下错误:

2018-12-11 16:34:04.067 29033-29033/it.gabtamagnini.realco E/AndroidRuntime: FATAL EXCEPTION: main
    Process: it.gabtamagnini.realco, PID: 29033
    java.util.ConcurrentModificationException
        at java.util.ArrayList$Itr.next(ArrayList.java:831)
        at it.gabtamagnini.realco.OrdiniActivity.saveStorico(OrdiniActivity.java:1396)
        at it.gabtamagnini.realco.OrdiniActivity$29.onClick(OrdiniActivity.java:1368)
        at android.view.View.performClick(View.java:5637)
        at android.view.View$PerformClick.run(View.java:22433)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6130)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

下面是我的方法中的代码:

 for(ItemModel itemModels : itemModel){
            boolean exist = false;
            for(ItemModel itemModel2 : itemStorico){
                if(itemModels.getCodiceArticolo().contains(itemModel2.getCodiceArticolo())) {
                    itemStorico.remove(itemModel2);
                    itemStorico.add(itemModels);
                    exist = true;
                }
            }
            if(!exist) {
                itemStorico.add(itemModels);
            }
        }

共有1个答案

何灿
2023-03-14

不能从“for-each”循环(for(item:collection)结构)内部调用remove()。这样做将引发ConcurrentModificationException

如果要在循环时循环并移除项,可以使用传统的“for”循环:

for (int i = 0; i < itemStorico.size(); ++i) {
    ItemModel itemModel2 = itemStorico.get(i);
    if (...) {
        itemStorico.remove(i);
        ...
    }
}

但是,这会引入一个微妙的bug。假设您正在循环[a,b,c,D]。如果您位于索引1,并从集合中删除b,则所有内容都将“滑过”,您将得到[a,c,d]。当您下一次查看索引2时,您将跳过C

您可以通过在删除时手动减少索引来避免该错误,但这有点粗略。

...
    itemStorico.remove(i);
    --i;
...

您还可以通过使用集合的iterator()来完全避免这个问题。

for (Iterator<ItemModel> iterator = itemStorico.iterator(); iterator.hasNext(); ) {
    ItemModel itemModel2 = iterator.next();
    if (...) {
        iterator.remove();
        ...
    }
}
 类似资料:
  • 我试图编辑我的deletar()方法,把一个迭代器移除元素,但没有工作,错误继续。

  • 我有一个自定义列表类的应用程序。尝试使用customer参数执行foreach函数时,会发生以下情况: 重要!我不能修改主代码 主要内容: XList类: 错误:

  • 这段代码应该创建一组数字(集合),将20个不同的数字放入其中,并从集合中删除所有大于1的数字。但当我运行它时,出现了一个错误:ConcurrentModificationException,

  • 我有一个假设,它有8个项目A-H,现在我想从中删除存储在int数组中的1,3,5位置项目。我该怎么做。 我正试着和你一起做这件事 但在数组的第一个被删除的项被更改之后,在下一次迭代中它删除了错误的元素或给出异常。

  • 我使用保存通过调用方法。然后,我尝试使用方法。但当我尝试这样做时,我得到了一个。这其中的原因是什么?我应该如何解决这个问题?

  • 问题内容: 谢谢Marko。我重写代码。尝试使其简单。这次它可以真正编译。但它只能删除彼此相邻的重复项。例如,如果我输入1 2 3 3 4 4 5 1,则输出为1 2 3 4 5 1。最后它无法拾取重复项。(顺便说一句:本网站的新内容,如果使任何显示混乱我的歉意) 这是新的代码: 问题答案: 要回答“删除java arraylist中的重复项”问题: 只需将所有元素放到中,就可以完成。 -要么-