Linked List en Java - ConcurrentModificationException [Résolu]

cs_sondos01 22 Messages postés mardi 10 juillet 2007Date d'inscription 14 décembre 2012 Dernière intervention - 29 juin 2010 à 11:23 - Dernière réponse :  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);
 
 	}
 	}
} 
 
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
cs_jojolemariole 519 Messages postés mercredi 21 mars 2007Date d'inscription 19 décembre 2016 Dernière intervention - 29 juin 2010 à 13:16
1
Merci
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

Merci cs_jojolemariole 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.