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

使用列表迭代器java移除元素时的ConcurrentModificationException

段坚
2023-03-14

即使使用迭代器,删除列表中的第1和第2个元素也会出现问题。

我已经阅读了以下的线索,但无法解决我的问题(这些是最相关的,但我也检查了其他材料):

尝试从列表中移除元素时的ConcurrentModificationException

List<List<String>> list = cnf.read();
List<List<String>> nlist = new ArrayList<>();
for (List<String> l : list) {
    if (l.size() <= 3) {
        nlist.add(l);
    } else {
        int size = l.size();
        while (size > 3) {
            List<String> three = l.subList(0, 2);
            three.add("Y" + (count++));
            //Iterator itr = l.iterator();
            ListIterator itr = l.listIterator();
            int v = 0;
            while (itr.hasNext()) {
                itr.next();
                if (v == 0 || v == 1) {
                    itr.remove();
                    v++;
                }
            }
            l.add(0, "Y" + (count++));
            size--;
            nlist.add(three);
        }
        nlist.add(l);
    }
}
for (List<String> l : nlist) {
    System.out.println(l.toString());
    System.out.println(l.size());
}

共有1个答案

慕容齐智
2023-03-14

经过长时间的调试,以下是解决方案。

子列表函数通过引用而不是值传递,由ArrayList.sublist调用创建的子列表保留对原始列表的引用,并直接访问其elementData数组。

因此,当向“three”列表添加元素时,我们将更改原始列表的状态。这种情况发生在这里:

                String one = l.get(0);
                String two = l.get(1);
                List<String> three = new ArrayList<>();
                three.add(one);
                three.add(two);
                three.add("Y" + (count));
 类似资料:
  • 我知道不建议在迭代时从列表中删除元素。 您最好使用iterator.remove()、java流,或者将remove复制到外部列表中。 但这段简单的代码正好起作用: 使用安全吗?

  • 我有客户对象的列表。我想迭代列表并按1递增顺序。 我尝试了每个列表,但在这里我必须创建新列表并在其中添加值。 有没有更好的方法?我尝试使用streams,但它只是映射订单

  • 问题内容: AFAIK有两种方法: 遍历集合的副本 使用实际集合的迭代器 例如, 和 是否有任何理由偏爱一种方法(例如,出于可读性的简单原因而偏爱第一种方法)? 问题答案: 让我举几个例子,并提出一些避免方案。 假设我们有以下藏书 收集并删除 第一种技术是收集所有要删除的对象(例如,使用增强的for循环),并在完成迭代后删除所有找到的对象。 假设你要执行的操作是“删除”。 如果要“添加”此方法也可

  • 问题内容: 假设我有一个数字列表: 迭代时,如何从列表中删除元素(例如3)? 我尝试了以下代码,但没有成功: 有任何想法吗? 谢谢,博达·西多(Boda Cydo)。 问题答案: 最好的方法通常是建设性地进行-建立所需项目的新列表,而不要删除不需要的项目。例如: 列表理解建立所需的列表,并分配到“全名单切片” ,确保你 不 只是一个重新绑定的名字,但完全替换 内容 ,所以影响是恒等于你想要的“清除

  • 问题内容: 我知道在迭代列表时不允许删除元素,但是在迭代时允许将元素添加到python列表中。这是一个例子: 我已经在我的代码中尝试过了,它似乎可以正常工作,但是我不知道是否是因为我很幸运,将来它会折断吗? 编辑:我不愿复制列表,因为“ myarr”很大,因此会太慢。另外,我需要使用“ somecond()”检查附加对象。 编辑:在某些时候“ somecond(a)”将为假,因此不能有无限循环。

  • 问题内容: 当我运行此代码时,我将抛出ConcurrentModificationException。 当我从列表中删除指定的元素时,列表似乎不知道其大小已更改。 我想知道这是否是集合和删除元素的常见问题? 问题答案: 我相信这是Iterator.remove()方法背后的目的,是能够在迭代时从集合中删除一个元素。 例如: