Arraylist en java

Fermé
chaudcacao - Modifié par chaudcacao le 23/01/2012 à 18:29
 chaudcacao - 23 janv. 2012 à 20:56
Bonjour,

j'ai une list de type T que je parcours avec un "for each" (for (Type t : List) )
mais je souhaite modifier la liste durant ce parcours, comme par exemple ajouter d'autres objets ou en retirer, et il me renvoie une erreur, apparemment on ne peut pas modifier une liste si elle est en paramètre d'une boucle for..
C'est logique en fait.

J'ai donc fait une copie de cette liste en la re-parcourant, et mis en paramètre la deuxième pour que les modifications puissent se faire dans l'originale.

Mais cela est surement très moche et ralentit beaucoup mon programme :(

voila un bout de code (java) :


ArrayList<Type> listeOriginale = new ArrayList<Type>();
ArrayList<Type> listeCopie = new ArrayList<Type>();

for (Type t : listeOriginale)
{
listeCopie.add(t);
}

for (Type t : listeCopie)
{
/* opération qui affecte la liste originale. */
}


Y'a-t il un moyen plus simple pour modifier une liste pendant une boucle for ?

(faire une copie en faisant listeCopie = listeOriginal me remet l'erreur du début, j'en déduit que le tableau est en fait le "meme"?)

Merci d'avance ! :)





A voir également:

3 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
23 janv. 2012 à 19:12
Tu peux faire des add(i,e) où i est l'emplacement exact de ta liste.
Si tu veux par exemple doubler ta liste et répéter chaque noeud tu peux faire :

for (int i=0; i<listeUnique.size(); i+=2)
	listeUnique.add(i,listeUnique.get(i));

Cependant, c'est moche et je suis quasiment certain qu'il serait bien mieux d'effectuer le calcul sur une nouvelle liste, comme ceci :

for (Type t : listeOriginale)
{
	listeCopie.add(t);
	listeCopie.add(t);
}

Après tout dépend où tu veux faire tes ajouts, si tu veux juste rajouter des éléments à la fin, tu peux te créer une liste temporaire que tu rajouteras à la fin une fois la boucle finie.

for (Type t : listeOriginale)
	listeTemporaire.add(t);
listeOriginale.addAll(listeTemporaire);

Remarque : dans ce dernier cas la liste temporaire peut-être une LinkedList, il n'y a aucune utilité à avoir un ArrayList ici.

En fait, je pense que tout ça va dépendre de ce que tu veux faire exactement, et sur ce point tu n'as pas été suffisamment précis pour t'aider d'avantage.
0
Merci de la réponse ! :D

C'est vrai que j'ai pas précisé grand chose car ca m'aurai forcé a expliquer le reste.. Ce serait long :(

En fait ce que j'aimerai vraiment faire c'est parcourir une liste et la modifier (retirer et ajouter des éléments peu importe l'ordre) pendant le parcours selon un attribut de l'objet qui est actuellement traité..

Je suis donc obligé de faire une copie ?
Et si j'en fais une, je suis obligé de passer par liste.add() plutot que "listeTemporaire = listeOriginale" pour ne pas avoir l'erreur qui m'indique que je ne peux pas modifier la liste utilisée pendant le for?

La liste copiée n'est pas a réutiliser apres.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
23 janv. 2012 à 19:44
Un petit exemple serait peut-être un peu plus clair ^^

Est-ce que ceci fonctionnerait ?

ArrayList<Type> listeDepart = ...
ArrayList<Type> listeArrivee = new ArrayList<Type>(); // est-ce que LinkedList ne suffirait pas ?

for (Type t : listeDepart)
    if (je garde t)
        listeArrivee.add(t);

listeDepart=listeArrivee;
0
Je vais expliquer plus en détail, ce sera peut etre plus simple ^^
je t'avoue aussi que je ne connais pas les LinkedList :(

Alors voila ! Je dois faire une "simulation de fourmillière", j'ai une classe mere "ant" avec 4 classes filles ("larva","worker","queen","male").
Dans une autre classe "anthill" (fourmillière :p) j'ai un attribut "ArrayList<ant> ants = new ArrayList<ant>()" qui contiens ces fourmis.
Les fourmis meurent et d'autres naissent en random, donc je pensais parcourir la liste "ants" et lancer une méthode pour chaque fourmi, qui vérifie si elle meure, si elle crée d'autres fourmies, si elle "évolue" (pour les larves) selon le type de fourmi.

Voila mon code sur les ArrayList :)


ArrayList<ant> ants = new ArrayList<ant>();

anthill hill = new anthill(); /*la classe qui contient le tableau "ants" */

ArrayList<ant> a = new ArrayList<ant>();

for (ant an : hill.ants)
{
a.add(an); /* a est donc la listeCopie*/
}

for (ant an : a)
{
an.grow(hill);
}


ce que je voulais faire a la base, c'était ca :

ArrayList<ant> ants = new ArrayList<ant>();

for (ant an : ants)
{
an.grow(hill);
}

mais j'ai l'erreur en question dont j'avais parlé..

la méthode "grow" de la classe "ant" ajoute ou enleve des fourmis dans le tableau selon l'age de celle ci et son type (si c'est une larve, une reine, etc..)

voila ce que je voulais faire ^^
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
23 janv. 2012 à 20:35
Une alternative, c'est utiliser les Iterator, à force de ne jamais m'en servir je les avais même oublié mais dans ton cas je crois que ça irait bien.

ArrayList<Type> liste = ...
ListIterator<Type> it = liste.getIterator();

while (liste.hasNext())
{
    Type t = liste.next();
    if (mon_test)
    {
        it.add(...);
        it.remove();
        ...
    }
}
0
Je vais try tout de suite, ca peut marcher je pense :)
0