这里有两个问题:
第一个问题是,在返回之后添加到 。如前所述,在修改基础时没有定义的行为,如以下文档所述:Collection
Iterator
Collection
Iterator.remove
...如果在迭代过程中以调用此方法以外的任何方式修改了基础集合,则未指定迭代器的行为。
第二个问题是,即使可以获得 an,然后返回到原来的同一元素,也不能保证迭代的顺序,如 Collection.iterator
方法文档中所述:Iterator
Iterator
...没有关于元素返回顺序的保证(除非此集合是提供保证的某个类的实例)。
例如,假设我们有 列表 。[1, 2, 3, 4]
假设是在 at 时添加的,并且不知何故,我们得到了一个可以从 中恢复迭代的。但是,之后没有保证书。迭代顺序可能是 -- 则迭代器仍将错过元素 。5
Iterator
3
Iterator
4
5
4
[5, 1, 2, 3, 4]
5
由于不能保证这种行为,因此不能假设事情会以某种方式发生。
一种替代方法是使用一个单独的元素,可以将新创建的元素添加到其中,然后迭代这些元素:Collection
Collection<String> list = Arrays.asList(new String[]{"Hello", "World!"});
Collection<String> additionalList = new ArrayList<String>();
for (String s : list) {
// Found a need to add a new element to iterate over,
// so add it to another list that will be iterated later:
additionalList.add(s);
}
for (String s : additionalList) {
// Iterate over the elements that needs to be iterated over:
System.out.println(s);
}
编辑
详细阐述Avi的答案,可以将我们要迭代的元素排队到队列中,并在队列具有元素时删除元素。这将允许除原始元素之外对新元素进行“迭代”。
让我们看看它是如何工作的。
从概念上讲,如果我们在队列中有以下元素:
[1, 2, 3, 4]
而且,当我们删除 时,我们决定添加 ,队列将如下所示:1
42
[2, 3, 4, 42]
由于队列是 FIFO(先进先出)数据结构,因此这种排序是典型的。(如队列
接口的文档中所述,这不是 必需的。以PriorityQueue
为例,它按自然排序对元素进行排序,因此这不是FIFO。Queue
下面是一个使用LinkedList
(
队列)的示例,以便遍历所有元素以及在去队列期间添加的其他元素。与上面的示例类似,在删除元素时添加元素:42
2
Queue<Integer> queue = new LinkedList<Integer>();
queue.add(1);
queue.add(2);
queue.add(3);
queue.add(4);
while (!queue.isEmpty()) {
Integer i = queue.remove();
if (i == 2)
queue.add(42);
System.out.println(i);
}
结果如下:
1
2
3
4
42
正如所希望的那样,出现了我们点击时添加的元素。42
2