ArrayList mit Iterator / Iterable ausgeben

polarpro

Mitglied
Hi,

ich versuche seit geraumer Zeit, eine simple ArrayList mit Hilfe der Schnittstellen Iterator und Iterable auszugeben. Leider jedoch hängt sich Eclipse jedes Mal nach der Ausgabe auf (java.lang.StackOverflowError). Hier meine Klasse Sammlung:
Java:
import java.util.*;

public class Sammlung implements Iterator, Iterable
{
	//Attribut:
	private ArrayList eineListe = new ArrayList();
	
	//Eine einfache Methode:
	public boolean hinzufuegen(Object obj)
	{
		return eineListe.add(obj);
	}
	
	//Implementieren die Schnittstelle Iterator:
	public boolean hasNext()
	{
		return hasNext();
	}
	
	public Object next()
	{
		return next();
	}
	
	public void remove()
	{}
	
	//Implementiert die Schnittstelle Iterable:
	public Iterator iterator()
	{
		return this;
	}
}

Und hier die UI-Klasse dazu:
Java:
import java.util.*;

public class SammlungUI
{
	public static void main (String args[])
	{
		Sammlung aSammlung = new Sammlung();
		aSammlung.hinzufuegen("aaa");
		aSammlung.hinzufuegen("bbb");
		aSammlung.hinzufuegen("ccc");
		
		Iterator iter = aSammlung.iterator();
		while(iter.hasNext())
		{
			System.out.println(iter.next());
		}
	}
}

Irgendwo steh ich auf dem Schlauch. Für einen Tipp bin ich dankbar, auch gerne, wenn wer einen guten Erklärungslink in Sachen Iterator und Iterable kennt.
 
Musst du den iterator selbst implementieren? Gib doch sonst einfach den iterator der liste zurück.
 
Ja,

wenn du
Code:
hasNext()
aufrufst und return
Code:
this.hasNext()
machst, dann ruft er sich selber auf ==> Endlosschleife.

Gruß,

Martin
 
Deine sammlung ist eigendlich eine ArrayList und die klasse gibt es ja schon.
Es ist an dieser stelle also ueberfluessig sich die muehe zu machen und einen
Iter selber zu schreiben

Java:
import java.util.*;
 
public class SammlungUI
{
    public static void main (String args[])
    {
        ArrayList<String> aSammlung = new ArrayList<String>();
        aSammlung.add("aaa");
        aSammlung.add("bbb");
        aSammlung.add("ccc");
        
// und dann gehe einfach mit einer foreach ueber deine Elemente
        Iterator iter = aSammlung.iterator();

        while(String s : aSammlung)
        {
            System.out.println(s);
        }
    }
}
 
Ja,

wenn du
Code:
hasNext()
aufrufst und return
Code:
this.hasNext()
machst, dann ruft er sich selber auf ==> Endlosschleife.

Hm. Was wäre die Alternative?

Ich habe übrigens gerade den Code geändert:
Java:
	//Implementiert die Schnittstelle Iterable:
	public Iterator iterator()
	{
		return eineListe.iterator();
	}
(statt return this; )

Auf diese Weise lässt sich die Endlosschleife vermeiden. Hm. ???:L
 
du nutzt dann den Iterator der Liste (siehe meinen Post). Deine hasNext(), next() Methoden werden dann nichtmehr genutzt.
 
Wenn es ums lernen geht.

Du kannst einen Wrapper schreiben und leitest dann alle Aufrufe die den Iter. betreffen an deine Liste weiter.

Ansonsten empfehle ich dir mit ein bischen Zeit die sourcen z.B ArrayList anzugucken und mal zu schauen
wie die Profis das so machen.

Aber sehr oft kommt man eigentlich nicht in die Gelegenheit einen Iterator selber schreiben zu muessen
 

Zurück
Oben