com.hero Posté(e) 7 juillet 2010 Share Posté(e) 7 juillet 2010 Bonjour, Est-ce moi qui ai mal compris la documentation? public void clear () Removes all elements from this ArrayList, leaving it empty. Ca supprime bien tout le contenu de la ArrayList? Mon problème se situe ici : ArrayList bars = new Arraylist(5); bars = recupererBars(); ArrayList ptsBar = new ArrayList(5); for(int b = 0; b < bars.size(); b++){ ptsBar = bars.get(b).getPtsBar(); for(...){ Traitement divers } } ptsBar.clear(); Lorsque ptsBar.clear() s'exécute, cela supprime à la fois le contenu de ptsBar (le résultat escompté), mais aussi le contenu de mon attribut contenu dans mon objet bars, qui est pourtant en private, si bien que l'utilisation ultérieure de ptsBar = bars.get(b).getPtsBar(); me renvois "null"... Est-ce normal que le clear() supprime récursivement? Merci pour la précision Bonne aprèm! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nivek Posté(e) 7 juillet 2010 Share Posté(e) 7 juillet 2010 Toute la nuance se trouve dans le fait que Java fonctionne essentiellement acec des références d'objet. Quand tu fais var1 = var2, tu ne copies pas l'objet 2 dans 1, mais la référence de l'objet 2 dans var1. Au final var1 et var2 pointent vers la même instance d'objet et donc toute action sur var1 edt forcément visible sur var2. Du coup tes 'new ArrayList' sur les instanciations de variables ne servent à rien : - tu déclares une variable - tu instancies un arraylist - tu affectes la référence de ce nouvel objet à ta variable - la ligne qui suit, tu remplaces cette référence par celle fournie par la methode recupererBars() => l'arraylist vide que tu as instanciée se retrouve seule au monde et sera détruite au prochain coup de garbage collector Concrètement, si ton ptsBar.clear() n'a pas d'autre but que d'imaginer libérer de la mémoire, ce n'est pas comme cela qu'il faut faire... et en fait tu n'as rien à faire car tu ne veux pas la libérer puisque tu n'as concrètement rien alloué si ce n'est des listes vides qui n'ont pas servi. Tu as réalisé les traitements de ton for() sur les objets originaux. Lien vers le commentaire Partager sur d’autres sites More sharing options...
com.hero Posté(e) 7 juillet 2010 Auteur Share Posté(e) 7 juillet 2010 J'ai réglé le problème en mettant ArrayList bars = new Arraylist(5); bars = recupererBars(); ArrayList ptsBar = new ArrayList(5); for(int b = 0; b < bars.size(); b++){ ArrayList ptsBar = bars.get(b).getPtsBar(); for(...){ Traitement divers } } ptsBar.clear() Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nivek Posté(e) 7 juillet 2010 Share Posté(e) 7 juillet 2010 liste1.addAll(liste2) va te permettre de définir une liste distincte. Tu pourras donc ordonner, ajouter, supprimer des éléments de liste1 sans perturber le contenu de liste2. Mais attention, si tu fais des modifications sur le contenu des éléments eux-même (Bars et PositionBar), ceux-ci n'ont pas été dupliqués. Si ce que tu veux faire c'est une copie en profondeur (deep copy), alors tu vas devoir le faire à la main en itérant sur les éléments de liste2, créer de nouvelles instances de chacun des éléments dans lesquels tu vas recopier les contenus et ajouter ces nouvelles instances à liste1. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nivek Posté(e) 7 juillet 2010 Share Posté(e) 7 juillet 2010 Mes commentaires sur ta "solution" dans le code : // Cette instanciation est inutile ArrayList bars = new Arraylist(5); bars = recupererBars(); // Cette variable n'est JAMAIS utilisée si ce n'est pour la vider. ArrayList ptsBar = new ArrayList(5); for(int b = 0; b < bars.size(); b++){ // Cette variable n'a RIEN à voir avec la précédente. Tu l'aurais appelée toto ce serait pareil. ArrayList ptsBar = bars.get(b).getPtsBar(); for(...){ Traitement divers } } // Ici tu vides une liste qui est forcément vide, tu n'y as pas touché dans les boucles for précédentes ptsBar.clear() Pour simplifier, ton code revient à : ArrayList bars = recupererBars(); for(int b = 0; b < bars.size(); b++){ ArrayList ptsBar = bars.get(b).getPtsBar(); for(...){ Traitement divers } } Lien vers le commentaire Partager sur d’autres sites More sharing options...
Pierre87 Posté(e) 7 juillet 2010 Share Posté(e) 7 juillet 2010 Allo le site du zero!!! Lien vers le commentaire Partager sur d’autres sites More sharing options...
com.hero Posté(e) 8 juillet 2010 Auteur Share Posté(e) 8 juillet 2010 Oui j'ai oublié de préciser que le rouge je l'avais supprimé et le vert rajouté. Je modifie juste ArrayList bars = new Arraylist(5); bars = recupererBars(); en ArrayList bars = recupererBars(); Je te remercies pour tes réponses bien claires! Bonne journée Lien vers le commentaire Partager sur d’autres sites More sharing options...
Infernus Posté(e) 8 juillet 2010 Share Posté(e) 8 juillet 2010 Une remarque pour ta boucle, ce serait plus joli de faire quelque chose genre. for (bars b : Bars) { ArrayList ptsBar = b.getPtsBar(); for(...){ Traitement divers } } Après je ne sais pas si ca te changeras des masses et si niveau execution ca ralenti ou accelère mais je propose ;) Lien vers le commentaire Partager sur d’autres sites More sharing options...
com.hero Posté(e) 8 juillet 2010 Auteur Share Posté(e) 8 juillet 2010 Hey =) Oui, j'ai vu pas mal cette syntaxe mais autant en PHP qu'en C++ j'ai toujours eu cette habitude du for([int]x = 0; x < toto; Après, si quelqu'un à une ressource sur les gains/pertes je suis preneur! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nivek Posté(e) 8 juillet 2010 Share Posté(e) 8 juillet 2010 Pour ce qui est de cette forme de boucle for qui a été introduite en Java 5, il faut faire attention à leur imbrication qui n'a pas un comportement équivalent à une double boucle for traditionnelle : http://download.oracle.com/docs/cd/E17476_01/javase/1.5.0/docs/guide/language/foreach.html Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.