Добавьте элементы в список, итерации по нему. (Ява)
Возможный дубликат:
Java: добавление элементов в коллекцию во время итерации
Моя проблема в том, что я хочу развернуть список с новыми элементами во время итерации по нему, и я хочу, чтобы итератор продолжал добавлять элементы, которые я только что добавил.
По моему мнению, ListIterator.add()
добавляет элемент перед текущим элементом в списке, а не после него. Можно ли добиться этого другим способом?
Ответы
Ответ 1
Вы не можете изменять коллекцию при ее повторении с помощью Iterator
, кроме Iterator.remove()
.
Однако, если вы используете метод listIterator()
, который возвращает 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
Это будет работать, за исключением случаев, когда список начинает итерацию пустым, и в этом случае прежнего элемента не будет. Если это проблема, вам нужно будет поддерживать какой-либо флаг, чтобы указать этот край.
Ответ 2
Как насчет
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);
Ответ 3
В 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
}