ArrayList元素未被删除

时间:2013-04-14 08:27:47

标签: java

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?

3 个答案:

答案 0 :(得分:3)

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

上面应该是:

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

答案 1 :(得分:2)

当您尝试从Iterator安全删除任何内容时,请使用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();}
 }

答案 2 :(得分:1)

使用迭代器的删除方法,如

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());
}
  

此类的迭代器和listIterator返回的迭代器   方法是快速失败的:如果列表在结构上被修改了   创建迭代器之后的时间,除了通过之外的任何方式   迭代器自己删除或添加方法,迭代器会抛出一个   ConcurrentModificationException的。

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