2013-04-14 169 views
-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”?为什么?无法从ArrayList中删除

+1

您的代码目前不会编译,因此它不会显示任何内容。请给出一个编译的例子,首先。你显然没有运行你发布的代码,所以我们不知道实际运行的代码是什么。 –

+0

此代码将导致并发修改异常,因为迭代器在从集合中删除元素后变得不可用。你不要告诉我们这个,所以你可能还没有试过。 – h22

回答

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

3

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

lstStr.removeAll(Collections.singleton("B")); 
+0

import java.util。*; class Drive { public static void main(String [] args){ArrayList lstStr = new ArrayList (); lstStr.add(“A”); lstStr.add(“R”); lstStr.add(“C”); String str; (Iterator it = lstStr.iterator(); it.hasNext();) {\t \t str = it.next(); 如果(str.equals( “R”)){lstStr.remove(它);}} 为 (迭代它= lstStr.iterator(); it.hasNext();) { System.out的。的println(it.next()); } } } – Brometheus

+1

@Brometheus:请不要在这样的评论中添加代码 - 特别是没有任何迹象表明*为什么*你这样做。如果你想改变你的问题(你应该 - 为了编译它,如果没有别的),你应该编辑问题,不要在答案上添加无意义的评论,或者在单独的帖子中提出一个新问题。 –

0

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