Linked List en Java - ConcurrentModificationException

Résolu
cs_sondos01 Messages postés 22 Date d'inscription mardi 10 juillet 2007 Statut Membre Dernière intervention 14 décembre 2012 - 29 juin 2010 à 11:23
 chefregion - 17 avril 2013 à 16:18
  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

cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
29 juin 2010 à 13:16
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
1
cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
29 juin 2010 à 13:24
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.
0
cs_sondos01 Messages postés 22 Date d'inscription mardi 10 juillet 2007 Statut Membre Dernière intervention 14 décembre 2012
30 juin 2010 à 11:45
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
 
0



[^^!1][^^langue3]
0
Rejoignez-nous