Тут є дві проблеми:
Перше питання полягає в додаванні до an Collection
після Iterator
повернення. Як уже згадувалося, немає визначеної поведінки, коли базовий матеріал Collection
модифікований, як зазначено в документації для Iterator.remove
:
... Поведінка ітератора не визначена, якщо основна колекція модифікується під час виконання ітерації будь-яким іншим способом, крім виклику цього методу.
Друге питання полягає в тому, що навіть якщо Iterator
можна було отримати та повернутись до того самого елемента, в якому Iterator
був, немає гарантії щодо порядку ітерації, як зазначено в Collection.iterator
документації до методу:
... Немає гарантій щодо порядку повернення елементів (якщо ця колекція не є екземпляром якогось класу, що забезпечує гарантію).
Наприклад, скажімо, у нас є список [1, 2, 3, 4]
.
Скажімо, 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) {
additionalList.add(s);
}
for (String s : additionalList) {
System.out.println(s);
}
Редагувати
Розробляючи відповідь Avi , можна поставити в чергу елементи, які ми хочемо перетворити в чергу, і видалити елементи, поки в черзі є елементи. Це дозволить зробити "ітерацію" над новими елементами на додаток до вихідних елементів.
Давайте подивимося, як це могло б працювати.
Концептуально, якщо в черзі є такі елементи:
[1, 2, 3, 4]
І коли ми видалимо 1
, ми вирішимо додати 42
, черга буде такою:
[2, 3, 4, 42]
Оскільки черга являє собою структуру даних FIFO (first-in, first-out), це впорядкування є типовим. (Як зазначено в документації до Queue
інтерфейсу, це не є необхідністю a Queue
. Візьмемо випадок, PriorityQueue
коли елементи впорядковуються за їх природним упорядкуванням, тож це не FIFO.)
Далі наведено приклад використання LinkedList
(що є a Queue
) для того, щоб пройти всі елементи разом з додатковими елементами, доданими під час видалення. Подібно до прикладу вище, елемент 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
з’явився.