Это зависит от того, как вы хотите, чтобы результирующий список выглядел.
Если вы довольны тем, что новые элементы существуют среди элементов, которые были изначально, вы можете взять пример ZouZou и использовать методы ListIterator
add()
и remove()
.
final List<Integer> list = new ArrayList<Integer>(Arrays.asList(2,3,4,5,6));
final ListIterator<Integer> ite = list.listIterator();
while( ite.hasNext() ) {
if( ite.next() %2 == 0 ) {
ite.add( 7 );
}
else {
ite.remove(); //removes the last value returned by next()
}
}
Вывод:
список = [2, 7, 4, 7, 6, 7]
Однако, если вы хотите, чтобы все новые элементы располагались после исходных элементов, лучше всего использовать вторую коллекцию.
final List<Integer> list = new ArrayList<Integer>(Arrays.asList(2,3,4,5,6));
final List<Integer> newList = new ArrayList<Integer>(list);
final ListIterator<Integer> ite = list.listIterator();
while( ite.hasNext() ) {
final Integer next = ite.next();
if( next % 2 == 0 ) {
newList.add( 7 );
}
else {
newList.remove(next);
}
}
Вывод:
новый список = [2, 4, 6, 7, 7, 7]
Лично я всегда был поклонником использования второго метода сбора, поскольку он позволяет избежать возможности ConcurrentModificationException
при итерации по индексу.
person
Dan Temple
schedule
15.05.2014
List<Integer> list = new ArrayList<>(Arrays.asList(2,1)); ListIterator<Integer> ite = list.listIterator(); while(ite.hasNext()){ if(ite.next()%2 == 0){ite.add(4);}}
правильно завершается и выводит[2,4,1]
. - person Alexis C.   schedule 15.05.2014