循环列表中删除

时间:2009-12-17 11:25:14

标签: java collections

    for (String fruit : list)
    {
        if("banane".equals(fruit))
            list.remove(fruit);
        System.out.println(fruit);
    }

这是一个带删除指令的循环。 在执行时,我在控制台输出下面得到一些ConcurrentModificationException:

Exception in thread "main" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:449)
at java.util.AbstractList$Itr.next(AbstractList.java:420)
at Boucle.main(Boucle.java:14)
abricot
banane

问题:如何用循环删除某些元素?

7 个答案:

答案 0 :(得分:83)

您需要直接使用迭代器,并通过该迭代器删除该项目。

for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); ) {
    String fruit = iterator.next();
    if ("banane".equals(fruit)) {
        iterator.remove();
    }
    System.out.println(fruit);
}

答案 1 :(得分:12)

这看起来有点复杂,为什么不只是做一个正常的循环?我认为它看起来更干净,不会抛出这个错误。如果你删除了某些内容,请记下我。无论如何,至少我的工作。我认为,那些类型的自动循环更适合编码方便,所以如果它们不方便那么就不要使用它们。

for (int i = list.size() - 1; i>=0; i--) {
    String fruit = list.get(i);
    System.out.println(fruit);

    if ("banane".equals(fruit)) {
        list.remove(fruit);
    }
}

答案 2 :(得分:6)

除了直接使用Iterator(我建议使用)之外,您还可以将要删除的元素存储在不同的列表中。

List<String> toRemove = new ArrayList<String>();
for (String fruit : list) {
    if ("banane".equals(fruit))
        toRemove.add(fruit);
    System.out.println(fruit);
}
for (String fruit : toRemove) {
    list.remove(fruit);
}

请注意,我不推荐这个,它只是另一种选择。 :)

答案 3 :(得分:4)

使用for循环,以相反的顺序循环遍历集合。 (这意味着,从最后一个元素开始,并循环到第一个元素。 通过这样做,您将不会因为从集合中删除元素而导致更改的索引出现问题。

您在发布的示例中得到异常,因为迭代器迭代的列表已更改,这意味着迭代器变为无效。

答案 4 :(得分:4)

for(Iterator<String> iter = list.iterator(); iter.hasNext(); )
{
   String fruit = iter.next();
   if("banana".equals(fruit))
      iter.remove();
   System.out.println(fruit);
}

答案 5 :(得分:1)

与Bombe建议的类似,但是通过迭代列表副本,但从较少的代码行中删除,但从原始列表中删除;

List<String> temp = new ArrayList<String>(list);
for (String fruit : temp)
{
    if("banane".equals(fruit))
        list.remove(fruit);
    System.out.println(fruit);
}

我个人认为这看起来比使用迭代器迭代更好。

答案 6 :(得分:1)

ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));
Iterator<String> iter = list.iterator();
while (iter.hasNext()) {
    String s = iter.next();

    if (s.equals("a")) {
        iter.remove();
    }
}

是最好的方法..