我想知道这是否可能,如果是的话,我该怎么办呢? 基本上我所看到的,并且认为问题是当我使用添加函数时迭代器的光标正在移动(我不完全理解迭代,所以我不知道这是否有问题)。当我删除一个元素然后添加两个时,问题就出现了更多(这是我发现问题的具体情况)。
我的代码是这样的:
List<String> list =new ArrayList<>();
for (ListIterator<String> iterator = list.listIterator(); iterator.hasNext();)
//here i am adding and removing elements
答案 0 :(得分:0)
ListIterator根据JLS
允许程序员遍历列表的列表迭代器 在任一方向上,在迭代期间修改列表,并获取 迭代器在列表中的当前位置。 ListIterator没有最新的 元件;它的光标位置总是位于元素之间 将通过调用previous()和将要返回的元素返回 通过调用next()返回。长度为n的列表的迭代器 具有n + 1个可能的光标位置,如插入符号(^)所示 下面:
您可以使用add(),remove()方法在迭代器中进行修改,同样会在列表引用中反映出来。
按照JLS删除
从列表中删除next()或者返回的最后一个元素 previous()(可选操作)。此调用只能进行一次 呼叫下一个或上一个。只有在没有添加(E)的情况下才能进行此操作 在对下一个或上一个的最后一次调用之后调用。
因此,如果您在不调用next()或previous()的情况下使用remove两次,则会抛出java.lang.IllegalStateException
我修改了你的代码来测试add()和remove()
public static void main(String[] args) {
List<String> list =new ArrayList<>();
list.add("55");
list.add("155");
list.add("255");
for (ListIterator<String> iterator = list.listIterator(); iterator.hasNext();){
System.out.println(list.size());
iterator.add("88");
System.out.println(list.size());
iterator.next();
System.out.println(list.size());
iterator.remove();
System.out.println("first remove done");
iterator.remove(); // will throw exception if previous or next is not called
}
System.out.println(list);
}