Тут є дві проблеми:
Перше питання полягає в додаванні до 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з’явився.