web-dev-qa-db-fra.com

Ajoutez des éléments à une liste tout en itérant dessus. (Java)

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?

30
adamfinstorp

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.

29
Bohemian

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
}
10
ptyx

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);
7
Bala R