Set iterieren und dazufügen?

Status
Nicht offen für weitere Antworten.
N

Neuling2

Gast
Hallo,

ich habe eine kleine Frage: Ist es möglich in ein LinkedHashSet Datensätze einzufügen, während man über dieses Set mithilfe einer while-Schleife iteriert? Ich bekomme da immer eine Exception, aber es muss da doch irgendein Workaround geben, oder nicht?

Danke
 

JFreak

Bekanntes Mitglied
Geht eigentlich nicht, da intern ein Zähler verwendet wird, der die (strukturellen) Änderungen mitzählt. Ändert sich diese Zahl, werden die Iteratoren ungültig. Daran kannst du eigentlich nichts ändern, es sei denn, du baust dir deine eigenes LinkedHashSet.
 
N

Neuling2

Gast
Das habe ich mir eigentlich schon gedacht. Wie löse ich das Problem denn am geschicktesten, gibt es da ein nettes Workaround?
 
G

Gast

Gast
merke dir was du einfügen willst und mach das dann nach der schleife
 

JFreak

Bekanntes Mitglied
Wenn du nur hinten dran fügen willst, schreib einfach in ein separates LinkedHashSet. Per add() kannst du das dann ganz einfach anfügen (müsste für Collection überladen sein). Ansonsten müsstest du dir damit behelfen, dass du ein HashSet (oder was auch immer) aus Integer (für die Position) und anzufügendem Datentyp machst, worüber du dann iterieren kannst.
 

byte

Top Contributor
JFreak hat gesagt.:
Wenn du nur hinten dran fügen willst, schreib einfach in ein separates LinkedHashSet. Per add() kannst du das dann ganz einfach anfügen (müsste für Collection überladen sein).
Das ändert doch nichts am Problem. Denn beim Iterieren fliegt dann halt die ConcurrentModificationException.

Ansonsten müsstest du dir damit behelfen, dass du ein HashSet (oder was auch immer) aus Integer (für die Position) und anzufügendem Datentyp machst, worüber du dann iterieren kannst.
Dann kannst Du gleich ne Liste nehmen und keine Menge. Denn Du kennst per se die Position der Elemente in einer Menge ja nicht.

Sinnvolle Lösungen des Problems wurden ja schon genannt: Entweder einzufügende Elemente merken und erst nach Iteration einfügen oder alternativ Element einfügen und Iteration erneut beginnen.
 

JFreak

Bekanntes Mitglied
Sorry, ich hab jetzt ein paar Datenstrukturen durcheinandergebracht. Du hast Recht, die Position kennt man nicht, also braucht man meinen zweiten Gedanken nicht.

Alternativ könntest du auch eine ganz neues LinkedHashSet bauen. Ist zwar nicht sonderlich effizient, aber vielleicht die Lösung, wo du am wenigsten im Quelltext modifizieren musst.

Code:
LinkedHashSet a = ...

LinkedHashSet b = new LinkedHashSet();
for (... //for-each o. Ä.
{
  // Iteration 
  b.add(...) //aktuelles Element aus "a"
  if (bedingung)
    b.add(...) //neues Element
}
a = b;
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben