36

可能重复:
Java:在迭代期间向集合添加元素

我的问题是我想在迭代它时用新元素扩展一个列表,并且我希望迭代器继续使用我刚刚添加的元素。

据我了解,ListIterator.add()在列表中的当前元素之前添加一个元素,而不是在它之后。是否有可能以其他方式实现这一目标?

4

3 回答 3

36

您不能在使用 迭代集合时修改集合Iterator,但Iterator.remove().

但是,如果您使用listIterator()返回 a 的方法ListIterator并对其进行迭代,则您可以修改更多选项。从 javadoc 为add()

新元素插入到隐式游标之前:... 后续调用previous()将返回新元素

鉴于此,此代码应该可以将新元素设置为迭代中的下一个元素:

ListIterator<T> i;
i.add(e);
i.previous(); // returns e
i.previous(); // returns element before e, and e will be next

这将有效,除非列表开始迭代为空,在这种情况下将没有前一个元素。如果这是一个问题,您将不得不维护某种标志来指示这种极端情况。

于 2011-09-13T23:42:35.830 回答
13

ListIterator 可能有一些技巧,但最简单的解决方案可能是旧式索引循环。验证性能不是问题(没有链接列表 - 但 ArrayList 很好)。

List<Object> myList;

for(int i = 0; i < myList.size(); i++)
{
  Object current = myList.get(i); 
  // Anything you insert after i will be discovered during next iterations
}
于 2011-09-13T23:53:35.783 回答
8

怎么样

List<Foo> fooList = getFooList();
List<Foo> tempFooList = new ArrayList<Foo>()


for(Foo f : fooList)
{
   ...
   // add items that need to be added to temp
   tempFooList.add(new Foo());
   ...
}

fooList.addAll(tempFooList);
于 2011-09-13T23:41:33.637 回答