Linked List en Java - ConcurrentModificationException [Résolu]

Signaler
Messages postés
22
Date d'inscription
mardi 10 juillet 2007
Statut
Membre
Dernière intervention
14 décembre 2012
-
 chefregion -
  Salut à tous,

J'essaye d'implémenter une liste chainé en Java. Voici mon algorithme que j'essaye de faire.

J'ai une liste TempList qui contient des éléments de type "Node". Avant de rajouter une Nouveau type Node, je souhaite vérifier s'il n'existe pas dans ma liste. S'il n'existe pas, je l'ajoute, sinon je récupère l'index du noeud déjà présent.

J'utilise pour ca les List Iterator de Java. Sauf que j'obtiens l'erreur " ConcurrentModificationException". Je n'ai pas le droit d'itérer sur une liste (i.e. utiliser aListIter.next()) alors que je suis entrain d'ajouter des éléments à ma liste. ( aList.add(aNode)).

Quelqu'un aurait un exemple d'un tel algorithme qui pourrai m'aider. Je vous ai joint un bout de mon code , si ca peu aider.

Merci,

Somz.

Node checkNode=null;
 
List <Node> aList = new LinkedList<Node>();
    ListIterator <Node> aListIter = aList.listIterator();	// iter is an iterator on TempList
 
if (aList.isEmpty()){
aList.add(aNewNode);
}
else if (aList.isEmpty()== false){
  
   aListIter = aList.listIterator();
   checkNode=aListIter.next();
   while(aListIter.hasNext()){
sameZvector=verifysameconfig(checkNode,aNewNode);
if (sameZvector){//same Z vector
 //.
 	}
 	else{ //  same Z vector not found --> creat the node
 		aList.add(aNewNode);
 
 	}
 	}
} 
 

4 réponses

Messages postés
519
Date d'inscription
mercredi 21 mars 2007
Statut
Membre
Dernière intervention
19 décembre 2016
22
Salut,

Premièrement, tes conditions sont foireuses. Il aurait fallu mettre ça (ce n'est pas équivalent à ton code, qui lui, passera systématiquement dans le bloc else) :

if (aList.isEmpty()){
aList.add(aNewNode);
} else {
...
}

Deuxièmement, cette ligne se met en général à l'intérieur du while :

checkNode=aListIter.next();

Enfin, la solution serait de ne pas utiliser une LinkedList. On ne choisit pas une Collection au hasard, on réfléchit un peu.

1) Combien d'éléments ma collection va-t-elle contenir?
2) Vais-je devoir effectuer des itérations complètes?
3) Vais-je devoir trouver 1 élément rapidement?
4) Vais-je devoir retirer des éléments fréquemment?
...

Tu pourrais peut-être utiliser un HashSet<Node>, ou bien un TreeSet<Node>.

Pour un HashSet, tu dois surcharger la méthode hashcode et equals sur l'objet Node, pour un TreeSet, tu dois rajouter implements Comparable<Node> sur ta classe Node et implémenter la méthode compareTo(...).

De cette manière les temps d'insertion seront largement diminués sur des grosses collections. En plus le code sera plus propre.

Pour t'aider il faudrait que tu nous montres le code source de Node (ou au moins ses principaux attributs).

Jonathan
Messages postés
519
Date d'inscription
mercredi 21 mars 2007
Statut
Membre
Dernière intervention
19 décembre 2016
22
Sinon, je remarque que ta boucle while ne semble pas correcte non plus.

Si tu veux utiliser la même base pour ton algorithme, procède plutôt en 2 temps :

1) Une méthode qui te retournes l'index d'une Node dans ta liste en s'appuyant sur la méthode verifysameconfig(...), si elle ne trouve pas une Node équivalent, elle renvoit -1

2) Une méthode d'insertion, qui se base sur la méthode précédente.
Messages postés
22
Date d'inscription
mardi 10 juillet 2007
Statut
Membre
Dernière intervention
14 décembre 2012

Désolé pour ce temps de latence de ma réponse.



Je vais essayer la méthode indiqué et je reviendrai vers toi si besoin


Merci

SomZ
 



[^^!1][^^langue3]