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 :

Problème avec ArrayList


Sujet :

Collection et Stream Java

  1. #1
    Membre habitué Avatar de Pecose
    Homme Profil pro
    Batiment
    Inscrit en
    Février 2013
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Batiment
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 310
    Points : 194
    Points
    194
    Par défaut Problème avec ArrayList
    Bonjour à tous,

    Je bloque sur certain aspects de l'ArrayList,
    J'aimerai trouver un moyen de modifier un ArrayList "en le parcourant".
    J'ai eu une idée qui ne fonctionne pas et je ne sait pas pourquoi (enfin ca fonctionne mais ca m'affiche une erreur)

    1-Je créé un ArrayList que j'appel x qui sera mon ArrayList a modifier.
    2-Comme je ne peut pas modifier x en le parcourant je fait un autre ArrayList y = x;
    3-Je parcours y et je modifie x c'est tout bête mais ca me donne ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
    at java.util.ArrayList$Itr.next(ArrayList.java:831)
    at version2.Acceuil.Display(Acceuil.java:62)
    Voila mon 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    public class Acceuil extends World{
     
    	public ArrayList<ArrayList> Bacterie = new ArrayList<ArrayList>();
     
    	public ArrayList<Bacterium> RedBacterie = new ArrayList<Bacterium>();
    	public ArrayList<Bacterium> BlueBacterie = new ArrayList<Bacterium>();
    	public ArrayList<Bacterium> GrayBacterie = new ArrayList<Bacterium>();
    	public ArrayList<Bacterium> OrangeBacterie = new ArrayList<Bacterium>();
    	public ArrayList<Bacterium> GreenBacterie = new ArrayList<Bacterium>();
     
    	public ArrayList<Bacterium> bacterie = new ArrayList<Bacterium>();
     
    	public Rectangle2D background = new Rectangle2D.Double(0, 0, Frame.panel.getScreenWidth(), Frame.panel.getScreenHeight());
     
    	public void Creation(){
     
    		Bacterie.add(RedBacterie);
    		Bacterie.add(BlueBacterie);
    		Bacterie.add(GrayBacterie);
    		Bacterie.add(OrangeBacterie);
    		Bacterie.add(GreenBacterie);
    	}
     
    	public void Display(){
    		Frame.panel.feuille.fill(background);
     
    		Bacterium x;;
     
    		bacterie = Bacterie.get(0);
    		Iterator<Bacterium> it = bacterie.iterator();
     
    		while(it.hasNext()){
    			x = it.next();
    			((Bacterium) Bacterie.get(0).get(bacterie.indexOf(x))).Move();
    			if(x.Reprod() && x.Speed != 0 && Bacterie.get(0).size() < 1000){ 
    				Bacterie.get(0).add(new Bacterium(x.posX+2, x.posY+2, x.color));
    				((Bacterium) Bacterie.get(0).get(bacterie.size()-1)).Creation(); 
    			}
    			if(x.Death()){ ((Bacterium) Bacterie.get(0).get(bacterie.indexOf(x))).Speed = 0; }
    			((Bacterium) Bacterie.get(0).get(bacterie.indexOf(x))).Display();//garder cette ligne avant remove
    			if(x.Final()){ Bacterie.get(0).remove(bacterie.indexOf(x)); }
     
    		}

    Si je clic sur Acceuil.java:62, ca me renvoi à Quel est mon erreur, et comment arriver a mon but avec un code simple.
    Merci de votre aide.
    Des jours c'est facile, des jours c'est pas facile, mais c'est jamais le même jour.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 553
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 553
    Points : 21 609
    Points
    21 609
    Par défaut
    Hello,

    Citation Envoyé par Pecose Voir le message
    2-Comme je ne peut pas modifier x en le parcourant je fait un autre ArrayList y = x;
    Ça ne sert à rien, tu n'as pas créé de nouvelle ArrayList, tu as juste créé une nouvelle variable vers la même ArrayList. Ça ne change rien au fait que tu ne peux pas la parcourir et la modifier en même temps.

    Le problème que tu nous montres n'est pas très clair. La première chose à faire est de jeter ce code et de le remplacer par quelque chose de clair et simple.
    De ce que j'en ai compris, tu as besoin de faire deux choses sur la liste :
    - ajouter des éléments à la fin
    - enlever l'élément en cours.

    Pour une chose pareille, et seulement si on utilise une ArrayList et pas une LinkedList,
    il vaut mieux faire une boucle de la forme : for(int i = 0; i < list.size(); i++) { au lieu d'un iterator. Attention quand même, quand tu enlèves un élément ça décale l'index de tous les suivants, donc il ne faut pas incrémenter i dans ce cas.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre habitué Avatar de Pecose
    Homme Profil pro
    Batiment
    Inscrit en
    Février 2013
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Batiment
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 310
    Points : 194
    Points
    194
    Par défaut
    Ok merci, là je comprend mieux mon erreur.
    Par contre c'est quoi la différence entre un ArrayList et un LinkedList?
    Des jours c'est facile, des jours c'est pas facile, mais c'est jamais le même jour.

  4. #4
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Je mets des commentaires :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    public class Acceuil extends World{
     
    	public ArrayList<ArrayList> Bacterie = new ArrayList<ArrayList>(); // ne nomme pas tes variables avec un majuscule au début, on pourrait les prendre pour des classes
    	// accessoirement, nomme tes variables pour ce qu'elles sont. Ici, tu as une Liste de Liste de bacterie. Donc un Tableau de bateries.
            // et pour éviter de caster de tous les côtés, tu peux le déclarer comme ça : public ArrayList<ArrayList<Bacterium>> mapBacteries = new ArrayList<ArrayList<Bacterium>>();
     
    	// autre chose dans tes déclarations de liste : essayes de déclarer les interfaces et pas les implémentations : public List<List<Bacterium>> mapBacteries = new ArrayList<List<Bacterium>>();
     
    	public ArrayList<Bacterium> RedBacterie = new ArrayList<Bacterium>(); // ici, il faudrait faire public List<Bacterium> listRedBacteries = new ArrayList<Bacterium>();
    	public ArrayList<Bacterium> BlueBacterie = new ArrayList<Bacterium>();
    	public ArrayList<Bacterium> GrayBacterie = new ArrayList<Bacterium>();
    	public ArrayList<Bacterium> OrangeBacterie = new ArrayList<Bacterium>();
    	public ArrayList<Bacterium> GreenBacterie = new ArrayList<Bacterium>();
     
    	public ArrayList<Bacterium> bacterie = new ArrayList<Bacterium>();
     
    	public Rectangle2D background = new Rectangle2D.Double(0, 0, Frame.panel.getScreenWidth(), Frame.panel.getScreenHeight());
     
    	public void Creation(){ // noms de méthodes avec la première lettre en minuscule !
     
    		Bacterie.add(RedBacterie);
    		Bacterie.add(BlueBacterie);
    		Bacterie.add(GrayBacterie);
    		Bacterie.add(OrangeBacterie);
    		Bacterie.add(GreenBacterie);
    	}
     
    	public void Display(){
    		Frame.panel.feuille.fill(background);
     
    		Bacterium x;; // un ; à enlever ici, et il faudrait nommer ta variable en fonction de son usage !
     
    		bacterie = Bacterie.get(0);
    		Iterator<Bacterium> it = bacterie.iterator();
     
    		while(it.hasNext()){
    			x = it.next();
    			((Bacterium) Bacterie.get(0).get(bacterie.indexOf(x))).Move(); // Que fait la méthode Move?
    			if(x.Reprod() && x.Speed != 0 && Bacterie.get(0).size() < 1000){ 
    				Bacterie.get(0).add(new Bacterium(x.posX+2, x.posY+2, x.color)); // ERREUR ici. Bacterie.get(0) fait référence à la même instance de liste que l'iterateur sur lequel tu travailles --> donc ça va planter ! On ne peut pas ajouter d'éléments dans une liste quand on la parcours avec un iterateur.
    				((Bacterium) Bacterie.get(0).get(bacterie.size()-1)).Creation(); 
    			}
    			if(x.Death()){ ((Bacterium) Bacterie.get(0).get(bacterie.indexOf(x))).Speed = 0; }
    			((Bacterium) Bacterie.get(0).get(bacterie.indexOf(x))).Display();//garder cette ligne avant remove
    			if(x.Final()){ Bacterie.get(0).remove(bacterie.indexOf(x)); } // ERREUR ici : pour supprimer un élément avec un iterateur, il faut utiliser la méthode remove()
     
    		}
    Le fait d'avoir toutes tes variables qui se nomment pareil et le fait de récupérer à chaque fois Bacterie.get(0) alourdit considérablement ton code, essayes de nettoyer un peu tout ça avant en utilisant une variable locale pour y voir plus clair.
    Accessoirement, une ligne comme :
    ((Bacterium) Bacterie.get(0).get(bacterie.indexOf(x))).Move();
    peut s'écrire plus simplement : x.Move();


    Pour tes noms de variables, essayes de te rappeler de cette règle : si tu ne trouves pas un nom qui explique pour quoi ta variable existe, c'est qu'elle n'a pas de raison d'être !
    Je ne suis pas mort, j'ai du travail !

  5. #5
    Membre habitué Avatar de Pecose
    Homme Profil pro
    Batiment
    Inscrit en
    Février 2013
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Batiment
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 310
    Points : 194
    Points
    194
    Par défaut
    Whaou! Super merci pour tout ces conseils, je vais faire le ménage dans mon code et je vais voir ce que ca donne.
    Des jours c'est facile, des jours c'est pas facile, mais c'est jamais le même jour.

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 553
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 553
    Points : 21 609
    Points
    21 609
    Par défaut
    Citation Envoyé par Pecose Voir le message
    Par contre c'est quoi la différence entre un ArrayList et un LinkedList?
    Comme leurs noms l'indiquent.
    ArrayList utilise un tableau pour stocker les éléments. LinkedList utilise une liste chaînée, chaque élément indiquant où trouver son suivant et son précédent.

    Ce qui signifie qu'avec une ArrayList on peut accéder instantanément à n'importe quel index, alors que pour une LinkedList si on veut un index précis il faut partir de son début ou de sa fin et la parcourir jusqu'à cet index.
    (Une LinkedList est utile si on veut souvent insérer/enlever des éléments ailleurs qu'à la fin. Parce qu'une ArrayList, dans ce cas, doit déplacer tous les éléments qui suivent l'insertion/suppression.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre habitué Avatar de Pecose
    Homme Profil pro
    Batiment
    Inscrit en
    Février 2013
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Batiment
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 310
    Points : 194
    Points
    194
    Par défaut
    Voila ce qu'il fallait faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bact = (ArrayList<Bacterium>) bacterie.get(0).clone();
    Merci de votre aide.
    Des jours c'est facile, des jours c'est pas facile, mais c'est jamais le même jour.

  8. #8
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 553
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 553
    Points : 21 609
    Points
    21 609
    Par défaut
    Dans ce cas-là les trucs que tu ajoutes à la fin ne seront pas parcourus par ta boucle.
    Et de manière générale la liste que tu avais avant, reste inchangée, tu ne modifies que celle que tu as construite pour l'occasion.

    Peut-être que c'est ce que tu voulais, peut-être pas, on peut pas savoir.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Problème avec ArrayList
    Par yarf dans le forum Collection et Stream
    Réponses: 12
    Dernier message: 03/07/2007, 10h50
  2. problème avec ArrayList et JVM
    Par ulysse031 dans le forum Collection et Stream
    Réponses: 29
    Dernier message: 26/04/2007, 20h47
  3. problème avec arraylist
    Par ulysse031 dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 27/02/2007, 12h00
  4. [débutant] problème avec arraylist
    Par sissi25 dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 17/12/2006, 16h01
  5. Problème avec ArrayList <String>
    Par fiphi dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 29/08/2006, 09h30

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