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?
答案 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