# ArrayList mit Iterator / Iterable ausgeben



## polarpro (27. Dez 2011)

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_:

```
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:

```
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.


----------



## Gast2 (27. Dez 2011)

Musst du den iterator selbst implementieren? Gib doch sonst einfach den iterator der liste zurück.


----------



## eRaaaa (27. Dez 2011)

Kein Wunder

```
public boolean hasNext()
    {
        return hasNext();
    }
```

:bae:


----------



## Marcinek (27. Dez 2011)

Ja,

wenn du 
	
	
	
	





```
hasNext()
```
 aufrufst und return 
	
	
	
	





```
this.hasNext()
```
 machst, dann ruft er sich selber auf ==> Endlosschleife.

Gruß,

Martin


----------



## polarpro (27. Dez 2011)

EikeB hat gesagt.:


> Musst du den iterator selbst implementieren? Gib doch sonst einfach den iterator der liste zurück.


Ja. aSammlung.iterator() wäre simpler gewesen, aber es geht darum, zu lernen, wie Iterator und Iterable funktionieren.


----------



## der-escrimador (27. Dez 2011)

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 


```
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);
        }
    }
}
```


----------



## polarpro (27. Dez 2011)

Marcinek hat gesagt.:


> Ja,
> 
> wenn du
> 
> ...



Hm. Was wäre die Alternative?

Ich habe übrigens gerade den Code geändert:

```
//Implementiert die Schnittstelle Iterable:
	public Iterator iterator()
	{
		return eineListe.iterator();
	}
```
(statt return this; )

Auf diese Weise lässt sich die Endlosschleife vermeiden. Hm. ???:L


----------



## Gast2 (27. Dez 2011)

du nutzt dann den Iterator der Liste (siehe meinen Post). Deine hasNext(), next() Methoden werden dann nichtmehr genutzt.


----------



## der-escrimador (27. Dez 2011)

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


----------

