-1
 import java.util;  
 class Driver{

 public static void main(String[] args) {
      ArrayList<String> lstStr = new ArrayList<String>();
      lsstStr.add("A");
      lsstStr.add("B");
      lsstStr.add("C");
      for(Iterator<String> it = lstStr.Iterator(); it.hasNext();)
      {
          str = it.next();
          if(str.equals("B")){lstStr.remove(str);}
      }
      for(Iterator<String> it = lstStr.Iterator(); it.hasNext();)
      {
        System.out.println(it.next());
      }
 }
 }

这不是从列表中删除“B”。为什么循环第二次运行时Str不等于“B”。为什么?

4

3 回答 3

4

你不能从你正在迭代的集合中删除一个项目,除了使用Iterator.remove- 你会得到一个ConcurrentModificationException. 所以你的循环会是这样的:

for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
    String value = iterator.next();
    if (value.equals("B")) {
        iterator.remove();
    }
}

当然,您应该使用removeAll删除具有特定值的所有项目 - 但如果您需要基于简单相等以外的某些条件(例如“删除所有长度大于 5 "。另一种选择是收集所有要删除的值到一个新集合中,然后再调用removeAll

于 2013-04-14T08:09:25.897 回答
3

试试这个:它将从您的列表中删除所有出现的“B”,而不会出现任何循环。

lstStr.removeAll(Collections.singleton("B"));
于 2013-04-14T08:07:37.330 回答
0

使用迭代器的remove方法。它将从集合中删除元素。

于 2013-04-14T08:09:33.620 回答