Bonjour,
J'ai pour le moment une ArrayList d'objets (appelons là List) que je souhaite parcourir.
Lors du parcous de List, si l'objet en cours répond à un certain critère, je souhaite le supprimer de List.
C'est là qu'est mon problème, comment faire au mieux ?
Mon pb est que si je créé une belle boucle
ça plante dès la 1ère suppression car j'ai pas le droit de modifier List alors que ma boucle For est basée dessus.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 for(Objet o : List) if test(o) List.remove(o);
Du coup, j'ai testé 2 choses qui fontionnent mais que je ne trouve pas très optimisées...
Inconvénient : 2 boucles for pour parcourir List
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 boolean[] toDelete = new boolean[List.size()]; int nbDeletedObject=0; int j=0; for(Objet o: List){ toDelete[j]=false; if(test(o)){ toDelete[j]=true; nbDeletedObject++; } j++; } if(nbDeletedObject!= 0) for(int i=List.size()-1; i>=0; i--) if(toDelete[i]) List.remove(i);
et
Inconvénient : get(i) surtout que i décroît...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 for(int i=List.size()-1; i>0; i--){ Object o= List.get(i); if(test(o)) List.remove(o); }
Conclusion, je pense qu'il faudrait que List soit une liste chaînée que je puisse parcourir "proprement" du dernier au premier élément, mais je vois pas quelle structure utiliser pour ça (LinkedList ne semble pas répondre à mes attentes) ?
Là, j'ai plus les idées claires si vous avez des propositions (même s'il faut changer le type de ma liste, je ne suis pas attaché à ArrayList plus que ça ) je suis preneur.
Merci à vous !
Partager