Duplicata possible:
Java: ajout d'éléments à une collection pendant l'itération
Mon problème est que je veux développer une liste avec de nouveaux éléments tout en itérant dessus et je veux que l'itérateur continue avec les éléments que je viens d'ajouter.
D'après ma compréhension, la ListIterator.add()
ajoute un élément avant l'élément actuel dans la liste, pas après. Est-il possible d'y parvenir d'une autre manière?
Vous ne pouvez pas modifier une collection pendant son itération à l'aide d'un Iterator
, à l'exception de Iterator.remove()
.
Cependant, si vous utilisez la méthode listIterator()
, qui renvoie un ListIterator
, et que vous répétez que vous avez plus d'options à modifier. Depuis le javadoc pour add()
:
Le nouvel élément est inséré avant le curseur implicite: ... un appel ultérieur à
previous()
retournerait le nouvel élément
Étant donné que, ce code devrait fonctionner pour définir le nouvel élément comme le prochain dans l'itération:
ListIterator<T> i;
i.add(e);
i.previous(); // returns e
i.previous(); // returns element before e, and e will be next
Cela fonctionnera sauf lorsque la liste commence l'itération vide, auquel cas il n'y aura aucun élément précédent. Si c'est un problème, vous devrez conserver un indicateur quelconque pour indiquer ce cas Edge.
Il peut y avoir une astuce avec ListIterator, mais la solution la plus simple est probablement une boucle d'index à l'ancienne. Vérifiez que les performances ne sont pas un problème (pas de listes chaînées - mais ArrayList est très bien).
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
}
Que diriez-vous
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);