2012-03-24 15 views
0

Mögliche Duplizieren:
ConcurrentModificationException and a HashMapjava.util.ConcurrentModificationException in Iterieren über TreeSet

ich die folgende Ausnahme bekommen

Exception in thread "main" java.util.ConcurrentModificationException 
at java.util.TreeMap$PrivateEntryIterator.nextEntry(Unknown Source) 
at java.util.TreeMap$KeyIterator.next(Unknown Source) 
at Types$AdjList.makeConnected(Types.java:281) 
at Main.main(Main.java:56) 

während den folgenden Code ausführen

public void makeConnected() { 
     TreeSet<Node> exploredNodes = new TreeSet<Node>(); 
     TreeSet<Node> unexploredNodes = new TreeSet<Node>(); 
for (Node n : unexploredNodes) { 
     ... 
     exploredNodes.add(n); 
     unexploredNodes.remove(n); 
     ... 
} 

Ich verwende nicht den Iterator wie in HashMap, sondern muss ein Set verwenden, das basierend auf einer Bedingung wachsen oder reduzieren kann. Ich werde alle Antworten akzeptieren und Punkte geben. Freuen Sie sich auf, wie man antwortet, wie dieses Problem von ConcurrentModificationException Dank zu lösen, Somnath

+0

@assylias: Ok, ich sehe es Iterator für – somnathchakrabarti

+0

@assylias TreeSet ist: Aber es gibt keine iterator.remove() für TreeSet. Wissen Sie, wie Sie mit einem Iterator aus einem TreeSet entfernen können? – somnathchakrabarti

+2

Alle Iteratoren verfügen über eine remove-Methode. Überprüfen Sie den zweiten Code in der ersten Antwort im obigen Link und ersetzen Sie die Karte durch Ihre Menge. – assylias

Antwort

4

Der for-Schleife intern verwendet Iteratoren und Sie entfernen nicht die Elemente des Iterator. Daher das Problem. Verwenden Iterators remove-Methode wie folgt:

for (Iterator iterator = exploredNodes.iterator(); iterator.hasNext();) { 
    Node n = (Node) iterator.next(); 
    unexploredNodes.add(n);   
    iterator.remove(); 
} 
+0

Ich kann den iterator.hasNext() nicht verwenden. Es erscheint eine Meldung: Die Methode hasNext() ist für den Typ HTMLDocument.Iterator nicht definiert – somnathchakrabarti