可能重复:
Java: adding elements to a collection during iteration
我的问题是我想在迭代它时使用新元素扩展一个列表,我希望迭代器继续使用我刚刚添加的元素。
据我所知,ListIterator.add()
在列表中的当前元素之前添加了一个元素,而不是在它之后。是否有可能以其他方式实现这一目标?
答案 0 :(得分:26)
使用Iterator
进行迭代时,您无法修改集合,Iterator.remove()
除外。
但是,如果您使用返回ListIterator
的{{3}}方法,并对其进行迭代,则可以使用更多选项进行修改。来自add()
的javadoc:
在隐式游标之前插入新元素:...后续调用
previous()
将返回新元素
鉴于此,此代码应该可以将新元素设置为迭代中的下一个元素:
ListIterator<T> i;
i.add(e);
i.previous(); // returns e
i.previous(); // returns element before e, and e will be next
这将起作用,除非列表开始迭代为空,在这种情况下将没有前一个元素。如果这是一个问题,你将不得不维护某种标志以表明这种边缘情况。
答案 1 :(得分:9)
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
}
答案 2 :(得分: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);