迭代列表,迭代它并迭代新元素

时间:2016-04-10 01:32:09

标签: java listiterator

我想知道这是否可能,如果是的话,我该怎么办呢? 基本上我所看到的,并且认为问题是当我使用添加函数时迭代器的光标正在移动(我不完全理解迭代,所以我不知道这是否有问题)。当我删除一个元素然后添加两个时,问题就出现了更多(这是我发现问题的具体情况)。

我的代码是这样的:

List<String> list =new ArrayList<>();
for (ListIterator<String> iterator = list.listIterator(); iterator.hasNext();)
      //here i am adding and removing elements

1 个答案:

答案 0 :(得分:0)

ListIterator根据JLS

  

允许程序员遍历列表的列表迭代器   在任一方向上,在迭代期间修改列表,并获取   迭代器在列表中的当前位置。 ListIterator没有最新的   元件;它的光标位置总是位于元素之间   将通过调用previous()和将要返回的元素返回   通过调用next()返回。长度为n的列表的迭代器   具有n + 1个可能的光标位置,如插入符号(^)所示   下面:

enter image description here

您可以使用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);
}