迭代时向元素添加元素.(JAVA)

ada*_*orp 30 java listiterator

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

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

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

Boh*_*ian 29

Iterator除了for之外,你不能在使用a迭代它时修改Collection 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
Run Code Online (Sandbox Code Playgroud)

这将起作用,除非列表开始迭代为空,在这种情况下将没有前一个元素.如果这是一个问题,你将不得不维护某种标志来表明这种边缘情况.

  • 这是错误的,列表和迭代器的目的是让你可以在迭代时修改它们 - 查看ListIterator的文档 - ListIterator.add(http://docs.oracle.com/javase/7/docs/api/java /util/ListIterator.html#add%28E%29).如果列表很大和/或空间有限,创建另一个列表可能不是最佳选择. (3认同)
  • 是的,现在是错的,也许ListIterator是新的,所以当答案是正确的.我是一个较新的Java用户,看到像这样的答案让我失望,因为我发现它可以完成.你声称"你不能在迭代时修改一个集合,[删除除外]"但你可以.从API链接:"列表的迭代器,允许程序员在任一方向遍历列表,**在迭代期间修改列表**,并获取迭代器在列表中的当前位置." (2认同)
  • 我们可以在迭代过程中使用 ListIterator 来修改列表。 (2认同)

pty*_*tyx 10

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
}
Run Code Online (Sandbox Code Playgroud)


Bal*_*a R 7

怎么样

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);
Run Code Online (Sandbox Code Playgroud)