Подтвердить что ты не робот

Добавьте элементы в список, итерации по нему. (Ява)

Возможный дубликат:
Java: добавление элементов в коллекцию во время итерации

Моя проблема в том, что я хочу развернуть список с новыми элементами во время итерации по нему, и я хочу, чтобы итератор продолжал добавлять элементы, которые я только что добавил.

По моему мнению, ListIterator.add() добавляет элемент перед текущим элементом в списке, а не после него. Можно ли добиться этого другим способом?

4b9b3361

Ответ 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
}