13 Stimmen

Iterator auf einem TreeSet verwenden

SITUATION: Ich habe ein TreeSet von benutzerdefinierten Objekten und ich habe auch einen benutzerdefinierten Comparator verwendet. Ich habe einen Iterator erstellt, der in diesem TreeSet verwendet wird.

TreeSet<Custom> ts=new TreeSet<Custom>();
Iterator<Custom> itr=ts.iterator();
while(itr.hasNext()){
    Custom c=itr.next();
    //Code to add a new element to the TreeSet ts
}

PREGUNTA: Nun, ich möchte wissen, dass, wenn ich ein neues Element zum TreeSet innerhalb der while-Schleife hinzufügen, dann wird dieses neue Element sofort sortiert werden. Mit anderen Worten, wenn ich ein neues Element innerhalb der while-Schleife hinzufüge und es kleiner ist als das, das ich gerade in c halte, werde ich dann in der nächsten Iteration das gleiche Element in c bekommen wie in der letzten Iteration? (da das neu hinzugefügte Element nach der Sortierung einen Platz irgendwo vor dem aktuellen Element einnehmen wird).

0voto

KNU Punkte 2444

Die Frage wurde zwar bereits beantwortet, aber ich denke, die zufriedenstellendste Antwort liegt in javadoc von TreeSet selbst

Die Iteratoren, die von der Iterator-Methode dieser Klasse zurückgegeben werden, sind ausfallsicher: Wenn die Menge zu irgendeinem Zeitpunkt nach der Erstellung des Iterators geändert wird, und zwar in irgendeiner Weise außer durch die eigene remove-Methode des Iterators, löst der Iterator eine ConcurrentModificationException aus. Somit schlägt der Iterator bei gleichzeitigen Änderungen schnell und sauber fehl, anstatt ein willkürliches, nicht-deterministisches Verhalten zu einem unbestimmten Zeitpunkt in der Zukunft zu riskieren.

Beachten Sie, dass das ausfallsichere Verhalten eines Iterators nicht garantiert werden kann, da es im > Allgemeinen unmöglich ist, in Gegenwart von unsynchronisierten gleichzeitigen Änderungen irgendwelche Garantien zu geben. Ausfallsichere Iteratoren werfen ConcurrentModificationException auf einer Best-Effort-Basis. Daher wäre es falsch, ein Programm zu schreiben, dessen Korrektheit von dieser Ausnahme abhängt: Das ausfallsichere Verhalten von Iteratoren sollte nur zum Aufspüren von Fehlern verwendet werden.

0voto

interestedparty333 Punkte 2206

Um den Fehler der gleichzeitigen Änderung zu vermeiden, der beim Einfügen zwangsläufig auftritt, könnten Sie auch eine temporäre Kopie der Menge erstellen, stattdessen durch die Kopie iterieren und das Original ändern.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X