Iterator über nested HashMaps

Pastafari

Mitglied
Hallo,

ich habe hier ein Problem mit einem Iterator über verschachtelte HashMaps.

Meine äussere Map hat die Struktur: HashMap<String, HashMap<String, String>>
die innere enthält nur Strings.

Zu Testzwecken habe ich meine Map mit sechs Werten befüllt.

Ich habe aber ein Problem mit meinem Iterator. Genauer bei meiner hasNext()-Methode. Anstatt sechs mal true zurückzugeben tut diese das in einer Endlosschleife.

Java:
@Override
public boolean hasNext() {
	while(iteratorAussen.hasNext()) {
		eintraege= mapAussen.values();
		iteratorInnen= eintraege.iterator();
		while(iteratorInnen.hasNext()) {
			System.out.println("foo");
			return true;
		}
	}
	return false;
}

Der iteratorAuusen läuft über das entrySet der äusseren Map, die Ausgabe "foo" ist nur zum Testen drinnen.

Kann mir da eventuell wer auf die Sprünge helfen?
 

Marco13

Top Contributor
Bei jedem aufruf von "iterator()" wird ein NEUER Iterator erzeugt. Der ist nie am Ende.

Man muss sich immer den aktuellen Iterator zwichenspeichern. Das ist ein bißchen frickelig, insbesondere schwierig wenn man das in der JavaDoc beschriebene Verhalten von Iteratoren einhalten will. Kannst ja mal schauen und sagen, wenn's nicht klappt. Als Inspiation kann vielleicht das von Landei in http://www.java-forum.org/allgemeine-java-themen/135448-listiterator-ueber-mehrere-arrays.html gepostete dienen, muss man mal genauer schauen
 

Pastafari

Mitglied
Danke für den Hinweis. Jetzt habe ich ihn immerhin soweit, dass hasNext() nur noch vier mal true zurückgibt. Das sind zwar immer noch zwei mal zu wenig, aber besser als unendlich oft.

Java:
@Override
public boolean hasNext() {
	if(iteratorAussen.hasNext()) {
		while(iteratorSave.hasNext()) {
			eintraege= iteratorSave.next();
			System.out.println(eintraege.toString());
			return true;
		}
	}
	return false;
}

Ich bekomme jetzt immerhin in "eintraege" HashMaps aus der äusseren Map geliefert. Da kann ich morgen hoffentlich mit weiterarbeiten :)
 
N

nillehammer

Gast
Bei Iteratoren müssen in der Schleife jeweils genau einmal ein hasNext()- und ein next()-Aufruf drinnen sein.
  • Vergisst man das next() gibt hasNext() immer true zurück, wenn mindestens ein Element enthalten ist, weil der Pointer nicht weiter bewegt wird.
  • Macht man öfter als einmal next(), fliegt irgendwann eine NoSuchElementException.
Ersteres war/ist das Problem in Deinen Schleifen. Außerdem kommt es mir merkwürdig vor, dass Deine Methode nicht mit lokalen Variablen oder Parametern für die Iteratoren arbeitet. Bei wiederholtem Aufruf stehen die Pointer der Iteratoren "irgendwo" und es kommt bestimmt nie das raus, was Du haben willst. Zumindest bei der inneren Schleife ist das aktuell ein Problem.

Ich ahne, dass Du sowas wie eine verschachtelte oder "tiefe" Iteration bauen willst. Ist das so?
 

Marco13

Top Contributor
Ja, sowas hatte ich schonmal in viel allgemeinerer Form gebastelt, kann ggf. mal schauen ob ich das heute abend ausgraben kann... falls du bis dahin keine Lösung findest...
 

Pastafari

Mitglied
Ich hatte mich gestern Abend zu früh gefreut. Meine hasNext() Methode hat zwar meinen Teststring in der richtigen Anzahl ausgegeben, hat aber doch nicht oft genug true zurückgegeben um damit next() oft genug aufgerufen wird.

Die Variablen meiner Iteratoren sind bei mir der Iteratorklasse zugehörig.

Wenn ich next() in meiner hasNext() aufrufe, wird das Ergebnis verfälscht, da der Pointer dann schon einen Schritt weiter geht. Wenn jetzt eine den Iterator aufrufende Methode hasNext() & next() aufruft wäre mein Pointer ja bereits zwei Felder weiter.
 
N

nillehammer

Gast
Wenn ich next() in meiner hasNext() aufrufe, wird das Ergebnis verfälscht, da der Pointer dann schon einen Schritt weiter geht. Wenn jetzt eine den Iterator aufrufende Methode hasNext() & next() aufruft wäre mein Pointer ja bereits zwei Felder weiter.
Du siehst, man muss sich bei der Benutzung von Iteratoren an ein paar Regeln halten und man verliert bei verschachtelten Iteratoren offensichtlich schnell mal die Übersicht. Deswegen hatte ich in meinem letzten Post auch etwas die Richtung und den Zweck abgefragt, den Du damit verfolgst.
 

Pastafari

Mitglied
Ich habe es jetzt so hinbekommen, dass ich in meiner hasNext() nur abfrage ob der äussere oder der innere Iterator noch ein hasNext() besitzt. Jetzt muss ich zwar vor dem ersten Aufruf von hasNext() prüfen ob es überhaupt eine Map gibt über die iteriert werden kann, aber ich finde es besser als meine Lösungsversuche mit Schleifen.

Den Rest habe ich über meine next() Methode gelöst. Es ist nicht wirklich schön geworden, aber mein Iterator läuft und er läuft auch schneller als gefordert wurde :D
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G ständig Iterator über Kollektion --> falsche Reihenfolge? Allgemeine Java-Themen 2
C Ein Iterator ist eine Implementierung des Interface Iterable? Allgemeine Java-Themen 2
D Iterator Allgemeine Java-Themen 1
M Iterator für trinären Baum Allgemeine Java-Themen 0
S OOP ClassCastException bei casting von eigener Klasse aus Iterator Allgemeine Java-Themen 3
D nested loops mit Iterator Allgemeine Java-Themen 2
A Compiler-Fehler Woher kommt der NullPointer? (Collections & Iterator) Allgemeine Java-Themen 7
J Mockito Iterator korrekt mocken Allgemeine Java-Themen 5
Q Iterator kopieren Allgemeine Java-Themen 6
G Byte- List mit einem Iterator durchlaufen Allgemeine Java-Themen 5
DEvent Wie behandelt man Exceptions in Iterator? Allgemeine Java-Themen 2
M Iterator wirft Exception Allgemeine Java-Themen 10
E Iterator durchlaufen? Allgemeine Java-Themen 8
Redfrettchen addAll verwendet kein Iterator? Allgemeine Java-Themen 8
D generischer Iterator und Set Allgemeine Java-Themen 2
D generischer Iterator mit verschiedenen Typen Allgemeine Java-Themen 3
K Iterator Allgemeine Java-Themen 5
K HashMap durchlaufen mit Iterator Allgemeine Java-Themen 5
C probleme mit iterator Allgemeine Java-Themen 2
kodela Datenübergabe über Buttons Allgemeine Java-Themen 8
W Jar-File Start nur über Terminal Allgemeine Java-Themen 13
A ByteArray über Socket Allgemeine Java-Themen 3
berserkerdq2 Text über einen Shape anzeigen (Scenebuilder) Allgemeine Java-Themen 1
I 2D-Grafik Vektor-Grafik über die Zwischenablage nach Adobe Illustrator transferieren Allgemeine Java-Themen 8
TheSkyRider Methode über DataInputStream "auslösen" Allgemeine Java-Themen 6
I OpenPDF erzeugt riesige PDFs, wenn Grafiken über PdfGraphics2D#drawImage gezeichnet werden Allgemeine Java-Themen 1
T Etikettendrucker über TCP-IP Allgemeine Java-Themen 1
Encera Gleichzeitiges Ausführen und verbinden von 2 Java-Klassen über die Eingabeaufforderung und Eclipse Allgemeine Java-Themen 21
B HTTP Allgemeine Fragen über Suchmaschine nutzen mit Java Allgemeine Java-Themen 20
torresbig Klasse mit extends Calendar über Methoden ändern (Hirnblockade) Allgemeine Java-Themen 7
B Liste ändern während Iteration über Diese? Allgemeine Java-Themen 16
Master3000 Java Konsole über Buffered Reader Zeilenweise auslesen ? Allgemeine Java-Themen 26
J Daten über serielle Schnittstelle empfangen Allgemeine Java-Themen 4
L Aufwandsabschätzung: Android-App Aufnahmefunktion (foto) und zweiter Ebene über dem Foto (teiltransparent) Allgemeine Java-Themen 6
M Registry Autostart Eintrag mit Java erstellen (über Windows cmd) Allgemeine Java-Themen 7
OSchriever Programm über Linux-Kommandozeile ausführen Allgemeine Java-Themen 20
J Namen von Methoden über Reguläre Ausdrücke bearbeiten Allgemeine Java-Themen 6
M Schnelleres Speichern von XML-Daten über URLConnection Allgemeine Java-Themen 4
M Keine weitere Eingabe in der Main möglich. Eventueller Ansatz über while. Allgemeine Java-Themen 8
Drachenbauer Wie kann eine vorgegebene Farbe über einen String erkannt werden? Allgemeine Java-Themen 11
W Variablenübergabe über mehrere Klassen Allgemeine Java-Themen 4
N Über einen Button in JavaFX ein Event über eine Pipeline schicken(Netty) Allgemeine Java-Themen 1
M Threads über Kommandozeile Allgemeine Java-Themen 5
david19 Software AE über Domain laufen lassen Allgemeine Java-Themen 0
Q Selbständig ActionEvent auslösen zum Daten senden über serielle Schnittstelle Allgemeine Java-Themen 7
T Problem mit externen Datenbankzugriff über SSH Tunnel Allgemeine Java-Themen 4
K Auf Dateiverzeichnis extern zugreifen (evtl über XML??) Allgemeine Java-Themen 22
C VisualVM oder Jconsole über Jolokia-Proxy Allgemeine Java-Themen 0
G USB-Pins über Java ansteuern Allgemeine Java-Themen 8
Ernesto95 Best Practice Localization über ResourceBundle Allgemeine Java-Themen 6
C Classpath Neue Klasse über einen Button ausführen Allgemeine Java-Themen 3
C Auslesen auslösen über Button-Click Allgemeine Java-Themen 8
M Fragen beantworten über Textfeldeingabe Allgemeine Java-Themen 5
AssELAss Best Practice Checksumme über jede Spalte zweier Tabellen und vergleichen Allgemeine Java-Themen 3
T Strings über Bluetooth zwischen PC,µc oder Samrtphone senden und empfangen Allgemeine Java-Themen 0
F Try/catch über ganze Klasse Allgemeine Java-Themen 9
kodela Eigenartige Datumsberechnung über GregorianCalendar Allgemeine Java-Themen 15
HarleyDavidson Best Practice Integer-Zahlenfolge über mehrere Programmstarts Allgemeine Java-Themen 7
T .jar über cmd ausführen (später dann batch) Allgemeine Java-Themen 6
F In OSX: Java-Programm über URI-Scheme aufrufen mit Parameter? Allgemeine Java-Themen 0
C Input/Output Zip Files über Socket senden und empfangen Allgemeine Java-Themen 6
M WebService - Zugriff auf Webservice Methode über Browser Allgemeine Java-Themen 1
C .jar File lässt sich nur über Konsole öffnen Allgemeine Java-Themen 1
L Videodateien über Java öffnen unabhängig vom Format Allgemeine Java-Themen 4
Thallius Hash über serialisiertes Objekt? Allgemeine Java-Themen 3
A Threads Lock über mehrere Abschnitte in verschiedenen Methoden Allgemeine Java-Themen 5
T Daten über port abfangen mit proxy server Allgemeine Java-Themen 12
M Eingabe von Arrays geht über gewünschte Anzahl hinaus Allgemeine Java-Themen 2
L Prüfen, ob Programm über 32bit oder 64bit Java ausgeführt wird Allgemeine Java-Themen 4
F Content-Disposition ermitteln über URL Allgemeine Java-Themen 2
ARadauer Checksumme über BigDecimal Werte Allgemeine Java-Themen 11
A Class Datei aus Verzeichnis über URLClassLoader laden Allgemeine Java-Themen 2
G Darstellung von Ergebnissen einer Dokumentensuche über eine JTable Allgemeine Java-Themen 19
S VLC + Lied über Java starten Allgemeine Java-Themen 17
M HTML-Code von Webseite über Browser oder Console auslesen?? Allgemeine Java-Themen 5
A Sinuston ausgeben und über Mikro Amplitude messen – machbar? Allgemeine Java-Themen 6
R Java-Progamm über Icon starten unter Windows Allgemeine Java-Themen 9
C Daten über URL an PHP verschicken Allgemeine Java-Themen 4
O Fragen über Fragen - Bei Änderung XML-Datei -> Anpassung GUI Allgemeine Java-Themen 7
aze Jar ausführen über Runtime.execute funktioniert nicht Allgemeine Java-Themen 4
S NoSuchMethodError beim Ausführen einer C Methode über JNI Allgemeine Java-Themen 5
H OOP Daten über TCP Allgemeine Java-Themen 5
R ListIterator über mehrere Arrays Allgemeine Java-Themen 13
G Interface Laden der Konfiguration über Interfaces sinnvoll? Allgemeine Java-Themen 28
D Player Objekt - Frame über Server anzeigen lassen. Allgemeine Java-Themen 3
B VoIP-Gespräche über Computer führen Allgemeine Java-Themen 3
S Jar-File startet nicht über doppelklick Allgemeine Java-Themen 2
C Java Programm über SSH starten Allgemeine Java-Themen 16
K Internetverbindung über PuTTy herstellen?! Allgemeine Java-Themen 9
C Kapselung Warum graift man auf Variablen nur über Methoden und nich direkt zu? Allgemeine Java-Themen 10
G Auf Kommandozeile über Processobjekt mit Outputstream Allgemeine Java-Themen 3
S Input/Output Binärdatei über Bytestreams Allgemeine Java-Themen 4
S Kommunikation von Core und GUI über Schnittstellen Allgemeine Java-Themen 2
J Explorer über Code starten Allgemeine Java-Themen 15
kodela Problem mit Kopieren über FileChannel Allgemeine Java-Themen 4
L Java und Javascript um Distanz über Google Maps zu berchnen Allgemeine Java-Themen 10
B UNIX Shell befehl über JavaCode ausführen Allgemeine Java-Themen 19
D Java Excel API - Schreiben in Excel lässt sich nicht über Makro starten Allgemeine Java-Themen 18
M Ampelsteuerung über Timer in Java realisieren Allgemeine Java-Themen 3
L CMD über Java öffnen Allgemeine Java-Themen 8

Ähnliche Java Themen

Neue Themen


Oben