【问题标题】:Removing numbers from a character list using java使用java从字符列表中删除数字
【发布时间】:2013-04-20 16:21:43
【问题描述】:

我想显示出现在字符列表中的数字,然后删除该数字。这是我的代码:

打包mytrials;

import java.util.ArrayList;
import java.util.ListIterator;

public class MyTrials {
    public static void main(String[] args) {
    ArrayList<Character> list = new ArrayList<Character>();
    list.add('a');
    list.add('1');
    list.add('5');
    System.out.println(list.size());
    for( ListIterator i = list.listIterator(list.size());  i.hasPrevious();){
        Character c = (Character) i.previous();
        if( Character.isDigit(c)){
            System.out.println(c + " is a digit");
            list.remove(c);
        }
    }
    System.out.println(list.size());
}
}

这是错误信息:

3
5 is a digit
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$ListItr.previous(AbstractList.java:386)
at mytrials.MyTrials.main(MyTrials.java:27)
Java Result: 1

这个错误的原因是什么,如何纠正。

【问题讨论】:

  • 您正在使用 ListIterator ,它不是故障安全迭代器,这就是您得到并发修改异常的原因

标签: java


【解决方案1】:

试试

i.remove(); 

而不是

list.remove(c);

See here

请注意,Iterator.remove 是在迭代期间修改集合的唯一安全方法;如果在迭代过程中以任何其他方式修改了底层集合,则行为是未指定的。

在需要时使用迭代器而不是 for-each(loop) 构造:

  • 删除当前元素。 for-each 构造隐藏了迭代器,因此您不能调用 remove。因此,for-each 构造不能用于过滤。

  • 并行迭代多个集合。

【讨论】:

  • 这确实是问题所在,+1。我想知道SO上有多少关于这个答案的问题。 :)
  • 解释将是一个很好的补充。
【解决方案2】:

尝试使用您的迭代器删除:

i.remove(); // instead of list.remove(c);

【讨论】:

    【解决方案3】:

    错误原因是使用list.remove(c);修改了迭代器的列表。直接修改列表时,迭代器失效,从而导致你的错误。

    正如 Achintya Jha 所发布的,您应该使用迭代器的删除功能

    【讨论】:

      【解决方案4】:

      list-iterator 是一个快速失败的迭代器,当一个线程试图修改列表内容而另一个线程正在迭代它时会引发异常。

      This might help and this one

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-21
        • 2022-01-08
        • 2015-10-25
        • 2021-12-28
        • 2021-09-21
        • 2016-04-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多