-3
import java.util.*;
class Drive{
    public static void main(String[] args) {
        ArrayList<String> lstStr = new ArrayList<String>();
        lstStr.add("A");
        lstStr.add("R");
        lstStr.add("C");
        String str;
        for(Iterator<String> it = lstStr.iterator(); it.hasNext();) {   
            str = it.next();
            if(str.equals("R")) {
                lstStr.remove(it);
            }
        }
        for(Iterator<String> it = lstStr.iterator(); it.hasNext();) {
            System.out.println(it.next());
        }
    }
}

无法理解发生了什么,为什么没有从 ArrayList 中删除 R?

4

3 回答 3

3
if(str.equals("R"))
    lstStr.remove(it);

上面应该是:

if(str.equals("R"))
    it.remove();
于 2013-04-14T08:29:44.910 回答
2

Iterator当您试图安全地删除任何东西时,请使用'remove 方法List。根据 API ,void remove(): 从底层集合中删除迭代器返回的最后一个元素(可选操作)。每次调用 next 时,此方法只能调用一次。如果在迭代过程中以除调用此方法之外的任何方式修改了基础集合,则迭代器的行为是未指定的。

您的代码需要稍作更正:

for(Iterator<String> it = lstStr.iterator(); it.hasNext();)
{ 
    str = it.next();
    // instead of iterator "it" put string "str" as argument to the remove()
    if(str.equals("R")){lstStr.remove(str);}
 }

虽然上面的代码在你的情况下可以工作,但是在很多边缘情况下它会失败。最好的方法是:

for(Iterator<String> it = lstStr.iterator(); it.hasNext();)
{ 
    str = it.next();
    // use iterator's remove()
    if(str.equals("R")){ it.remove();}
 }
于 2013-04-14T08:37:29.443 回答
1

使用迭代器的 remove 方法,例如,

List<String> lstStr = new ArrayList<String>();
lstStr.add("A");
lstStr.add("R");
lstStr.add("C");
String str;

for(Iterator<String> it = lstStr.iterator(); it.hasNext();)
{ 
    str = it.next();
    if(str.equals("R"))
    {
        it.remove();
    }
}

for(Iterator<String> it = lstStr.iterator(); it.hasNext();)
{
    System.out.println(it.next());
}

此类的 iterator 和 listIterator 方法返回的迭代器是快速失败的:如果在创建迭代器后的任何时间对列表进行结构修改,除了通过 迭代器自己的 remove 或 add 方法之外的任何方式,迭代器将抛出 ConcurrentModificationException。

http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html

于 2013-04-14T08:34:22.447 回答