Aller au contenu

[RESOLU] ArrayList.clear() ne supprime pas que le contenu


com.hero

Recommended Posts

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

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

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

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

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

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

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

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...