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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
for(Objet o : List) if test(o) List.remove(o);
ç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.

Du coup, j'ai testé 2 choses qui fontionnent mais que je ne trouve pas très optimisées...


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);
Inconvénient : 2 boucles for pour parcourir List

et

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);
    }
Inconvénient : get(i) surtout que i décroît...

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 !