Iterator Interfacve

OnDemand

Top Contributor
Hi,

kann mir jemand helfen? In einer Aufgabe sollen wir verschiedene Objekte in einer List "anmelden" und wieder löschen sobald die Objekte geschlossen werden soweit kein Problem. Als Zusatzinformation steht aber noch: "beachten Sie das das Iterator-Objekt inkonsistent wird, wenn Sie die Objekte direkt aus der Liste entfernen".

Ich kann in der API nix finden, dass Iterator inkonsistent wird?! Hat jemand ne Idee, was damit gemeint sein kann?

LG
 
Ich nehme an das soll Dich nur darauf hinweisen, dass man z.B. mit einem foreach keine Elemente aus der Liste entfernen kann, da in dem Fall der Iterator inkonsistent wird.

Gruß

Claus
 
Hi, mit Iteration.clear() meine ich meinen Iterator/Liste zu clearen also quasi:

Java:
iterator = list.iterator();
iterator.clear();

Nun, das an und abmelden klappt wunderbar (also adden und removen aus der List)

Aber noch ne Frage, warum erhalte ich ArrayIndexOutOfBoundsExe, wenn ich das -1 in der for-Schleife wegnehme?

Java:
private JMenuItem getJmiCloseWindows() {
	JMenuItem jmiCloseWindows = new JMenuItem("Alle Fenster schließen");
	jmiCloseWindows.addActionListener(new ActionListener() {
	    public void actionPerformed(ActionEvent e) {

		for (int i = 0; i <= list.size()-1; i++) {
		    list.iterator();
		    while (list.iterator().hasNext() == true) {
			list.get(i).dispose();
			break;
		    }
		}
		list.clear();
		System.out
			.println("Elemente in Liste nach Operation \"Alle Fenster schließen\" "
				+ list.size());

	    }
	});
 
Zuletzt bearbeitet:
Java:
        for (int i = 0; i <= list.size()-1; i++) {
            list.iterator();
            while (list.iterator().hasNext() == true) {
            list.get(i).dispose();
            break;
            }
        }
        list.clear();

....ach herrje, was soll das denn werden? 😱

Mal Hand aufs Herz, verstehst du, was der Code, den du da geschrieben hast, macht? Oder hast du einfach nur herumprobiert, bis irgendwann zufällig das gewünschte Ergebnis eintritt? Ich bin gerade ein bisschen sprachlos und weiß gar nicht, wo cih anfangen soll. Aber .. .wie auch immer deine Antwort ausfällt. Diesen Code-Abschnitt musst du definitiv noch einmal komplett überdenken und neu schreiben!
 
3 Jahre Java? Ach solange wie ich hier angemeldet bin..naja wenn du meinst zu wissen wie lange ich es lerne hast du natürlich recht.
 
@stg ich verstehe es so, wie ich es geschrieben habe und es tut auch das was es soll! Man kann es sicherlich einfacher schreiben, aber um himmels willen, ich lerne noch!

Wer etwas vereinfachendes beitragen kann, ich bin für alles offen. Andernfalls muss ich euch leider sagen, dass ich nur das verwenden kann, was ich mir aus den Heften aneignen kann.

Ihr schafft es echt immer wieder einem die Motivation zu nehmen...fast 😀

edit: die Zeile 2 ist sinnlos, die gibts schon garnicht mehr und das == true kommt auch weg 🙂
 
Zuletzt bearbeitet:
Ist dir auch klar, dass du zweimal so viele Iteratoren erzeugst, wie es Elemente in deiner Liste gibt? Und das, obwohl du diese hinterher eigentlich überhaupt nicht benutzt? 😉
 
Ach du s*****e, jetzt weiß ich glaube was du meinst. In der schleife wird es ständig erzeugt, es reicht einmal vor schleifeneintritt richtig? :-/
 
Du hast da insgesamt ein totales durcheinander ... 🙁

Fassen wir mal zusammen. Du hast eine Liste (von JFrames oder was auch immer) und möchtest nun einmal über diese Liste laufen und dabei irgendwas tolles auf jedem dieser Objekte anstellen. Da sollte dir sofort ins Auge springen, dass dafür eigentlich eine Schleife, in der du über die gesamte Liste iterierst, ausreichen sollte. Du hast hier aber zwei verschachtelte Schleifen ... wozu?

Nun hast du verschiedene Möglichkeiten über die Liste zu iterieren. Du kannst dir zum Beispiel mal hier: How to loop / iterate a List in Java verschiedene Varianten dazu anschauen. Allgemein lässt sich aber schon mal sagen: Entweder greifst du direkt auf das jeweilige Listenelement zu (mittels
Code:
list.get(i)
), oder aber du holst dir über den Iterator das jeweils nächste Listenelement (mittels
Code:
it.next()
)

Beides ist möglich und je nach Kontext ist eine Variante der anderen überlegen. Wenn du zum Beispiel während der Iteration über eine Liste bereits Element aus dieser Liste entfernen willst, dann solltest du das über den Iterator und seine
Code:
#remove()
-Methode machen.
 
Eine mögliche Variante über den Iterator zu gehen, sähe zum Beispiel so aus:

Java:
for (Iterator<JFrame> it = list.iterator(); it.hasNext(); ) {
    JFrame jf = it.next();
    jf.dispose();
}
lsit.clear();
 
Achso.. Mich verwirrt eben die ursprüngliche Aussage, dass das Iterator Objekt inkonsistent wird, wenn man Elemente direkt raus nimmt. Also besser nicht über die remove vom Iterator? Ich frag morgen nochmal genauer nach, was damit gemeint ist.
Aber vermutlich soll man nicht mit remove gehen sondern mit get
 
Zuletzt bearbeitet:
Achso.. Mich verwirrt eben die ursprüngliche Aussage, dass das Iterator Objekt inkonsistent wird, wenn man Elemente direkt raus nimmt. Also besser nicht über die remove vom Iterator? Ich frag morgen nochmal genauer nach, was damit gemeint ist.
Aber vermutlich soll man nicht mit remove gehen sondern mit get

Wenn du Objekte direkt aus der Liste entfernst!

Java:
for (Iterator<JFrame> it = list.iterator(); it.hasNext(); ) {
    JFrame jf = it.next();
    jf.dispose();
    it.remove();  // Aktuelles Element wird per remove 
                         // vom Iterator entfernt: OK!
}


Java:
for (Iterator<JFrame> it = list.iterator(); it.hasNext(); ) {
    JFrame jf = it.next();
    jf.dispose();
    list.remove(jf);  // Aktuelles Element wird direkt aus 
                             // der Liste entfernt: NICHT OK!
}
 
Zuletzt bearbeitet:

Zurück
Oben