IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

remplissage d'un ArrayList


Sujet :

Collection et Stream Java

  1. #1
    Membre confirmé Avatar de Space23
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 185
    Par défaut remplissage d'un ArrayList
    Bonjour,

    J'ai un petit soucis d'écriture de code, je vous le met directement ça sera plus parlant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ArrayList<Solution> groupesCrusta = new ArrayList<Solution>();
    		Solution unGroupe ;
    		for (int i=0; i<7; i++) {
    			for (int j=0; j<7; j++) {
    				unGroupe = trouveGroupe(i, j, 1);
    				if (unGroupe != null) {
    					groupesCrusta.add(unGroupe);
    				}
    			}
    		}
    Si je fais ça, quand je vais trouver un deuxieme groupe, le premier élément de mon ArrayList sera écrasé pour être remplacé par le deuxième non?

    C'est une question toute con mais je ne vois pas comment contourner le problème sans faire du code tout moche .

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 476
    Par défaut
    Si je fais ça, quand je vais trouver un deuxieme groupe, le premier élément de mon ArrayList sera écrasé pour être remplacé par le deuxième non?
    non, il sera ajouté à la suite du dernier élément ajouté.
    Valable pour tous les implémentations de java.util.List.

    Tu peux voir ca dans la javadoc:
    http://java.sun.com/javase/6/docs/ap...util/List.html

  3. #3
    Membre confirmé Avatar de Space23
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 185
    Par défaut
    ah ok je ne voyais pas ça comme ça. Si j'avais utilisé un tableau à la place de ma liste j'aurais eu le problème?

  4. #4
    Membre expérimenté Avatar de Roy Miro
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 273
    Par défaut
    Citation Envoyé par Space23 Voir le message
    ah ok je ne voyais pas ça comme ça. Si j'avais utilisé un tableau à la place de ma liste j'aurais eu le problème?
    Non plus.
    En effet quand tu ajouté un objet A dans une collection ou un tableau, tu y ajoute en fait une référence vers ton objet A.

    Ce dernier ne risque donc pas d'être supprimé par le garbage collector.

    Ensuite ta référence unGroupe () qui jadis pointait sur A, peut maintenant pointer sur un autre objet B.

    A étant référencé désormais par la collection (ou le tableau).

  5. #5
    Membre confirmé Avatar de Space23
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 185
    Par défaut
    Donc à chaque fois que je change la valeur de ma variable , c'est la référence de cet objet qui va être changé (si j'ai bien tout compris ).

    Le garbage collector passe derrière pour vérifier que l'ancienne référence n'est utilisé par aucune instance.

  6. #6
    Membre expérimenté Avatar de Roy Miro
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 273
    Par défaut
    Le garbage collector passe derrière pour vérifier que l'ancienne référence n'est utilisé par aucune instance.
    Non.

    Ton objet est dit référencé s'il est au moins "pointé" par une variable ("référence" dans le gargon POO).
    Le garbage collector s'occupe de détruire les objets qui ne sont plus référencés. Il ne détruit donc que des objets. En java, tu manipules ton objet via une ou des références qui pointent dessus.

    Donc si aucune variable (référence) pointe sur lui, il devient "inatteignable" ,tu ne peux plus le manipuler et là, le gc n'a plus qu'à exécuter sa basse besogne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    A a = new A(); // la variable  'a' référence un objet 'A1'
     
    List list = new ArrayList();
     
    list.add(a); // 'A1' est référencé une fois de plus (par list):2 références au total sur lui
     
    a= new A()// la variable 'a' pointe désormais sur un nouvel objet 'A2', mais 'A1' ne risque pas d'être détruit car il est encore référencé par list
     
    list.add(a);
    System.out.println(list.size()); //affiche 2
    Il se passe la même chose avec ta boucle for.

  7. #7
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Par défaut
    Le code suivant donne le même résultat que ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    ArrayList<Solution> groupesCrusta = new ArrayList<Solution>();
     
    for (int i=0; i<7; i++) 
    {
      for (int j=0; j<7; j++) 
      {
        Solution unGroupe = trouveGroupe(i, j, 1);
        if (unGroupe != null) 
        {
    	groupesCrusta.add(unGroupe);
        }
      }
    }
    Si ça peut t'aider pour la compréhension.

    Je n'ai pas pu m'empecher de mieux identer le code

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 476
    Par défaut
    Je n'ai pas pu m'empecher de mieux identer le code
    Discret avec la petite taille de font

  9. #9
    Membre confirmé Avatar de Space23
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 185
    Par défaut
    Je crois que j'ai compris. Je suis tombé sur un autre cas chiant qui illustre le problème :

    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
     
    // la variable  'listeSolutions' référence un objet 'ArrayList<Solution>1'
    private ArrayList<Solution> supprDoublons(ArrayList<Solution> listeSolutions) {
    	int i=0;
    	boolean supp;
    	//La variable 'listeSolucesEpuree' référence une fois de plus 'ArrayList<Solution>1' par transition.
    	ArrayList<Solution> listeSolucesEpuree = listeSolutions;
    	for (Solution solution1 : listeSolutions) {
                     if (supp) {
    				//Je supprime une occurence de 'listeSolucesEpuree' et donc par conséquent de 'ArrayList<Solution>1' que je référence.
    				listeSolucesEpuree.remove(solution1);
    				break;
    		}
    	}
    }
    Ici quand je fait mon remove, ça me supprime l'occurrence dans mon arrayList passé en paramètre.

    Si je ne veux pas que listeSolucesEpuree soit raccroché à la même référence que 'listeSolutions' est-ce qu'il faut que je clone mon objet 'listeSolutions'?

    PS : J'ai essayé de bien indenter le code pour ne pas choquer la sensibilité de certains .

  10. #10
    Membre expérimenté Avatar de Roy Miro
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 273
    Par défaut
    Ici quand je fait mon remove, ça me supprime l'occurrence dans mon arrayList passé en paramètre.

    Si je ne veux pas que listeSolucesEpuree soit raccroché à la même référence que 'listeSolutions' est-ce qu'il faut que je clone mon objet 'listeSolutions'?
    Là, tu as deux références sur une même ArrayList (celle passée en paramètre). Tout au long de ton code tu ne manipule qu'une seule et même liste. Ta référence ArrayList<Solution> listeSolucesEpuree est inutile.

    D'ailleurs ton code compile? Car tu as oublié d'initialiser le boolean supp

    Si je ne veux pas que listeSolucesEpuree soit raccroché à la même référence que 'listeSolutions' est-ce qu'il faut que je clone mon objet 'listeSolutions'?
    Pour sauvegarder ta liste dans une nouvelle liste, tu peux utiliser le constructeur dédié de la classe ArrayList:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<Solution> nelleObjetListe = new ArrayList(listeSolutions)
    Après ça, tu auras bien 2 listes.

  11. #11
    Membre confirmé Avatar de Space23
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 185
    Par défaut
    D'ailleurs ton code compile? Car tu as oublié d'initialiser le boolean supp
    Oui j'ai simplifié le code pour ne garder que la partie pertinente.

    Pour sauvegarder ta liste dans une nouvelle liste, tu peux utiliser le constructeur dédié de la classe ArrayList:
    Merci c'est exactement ce que je recherchais

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Actualiser un JTable au remplissage d'une ArrayList
    Par teribilis dans le forum Composants
    Réponses: 0
    Dernier message: 02/12/2012, 16h08
  2. Remplissage de arrayListe
    Par mariamti dans le forum Collection et Stream
    Réponses: 10
    Dernier message: 22/02/2008, 08h45
  3. remplissage d'un ArrayList
    Par rcober dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 07/02/2008, 11h13
  4. Réponses: 13
    Dernier message: 14/10/2003, 14h31
  5. Réponses: 11
    Dernier message: 04/08/2003, 15h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo