# Hilfe beim implementieren von Iterator



## voodoomonkey (13. Jan 2011)

Hallo. Ich soll im folgenden die Elemente der ArrListe mittels eines Iterators auf der Console ausgeben. Leider hakt es bei mir hier aufgrund dessen, dass der Array in einer Klasse ArrListe verpackt is. Kann mir da jemand den Source vervollständigen ?



```
import static jsTools.Input.*; import java.util.*; 
 
class ArrListe<T>{ 
  T elem[]=(T[]) new Object[10]; 
  int pos=0;  // verweist auf das erste freie Element im Array 
 
  void insert(T b) 
  { 
    elem[pos++]=b;  //Einfügen und hochzählen von pos 
  }  
} 
 
public class Winter09{ 
  static class Tier{ 
    String rasse; 
    String name; 
    Tier (){ 
      rasse = readLine("Kennzeichen"); 
      name  = readLine("Kennzeichen"); 
    } 
  }   
  public static void main(String args[]){ 
    ArrListe<Tier> li=new ArrListe<Tier>(); 
   
    for (int i=0; i<3; i++) 
      li.insert(new Tier()); 
       
    
    System.out.println("Die eingegebenen Tiere sind:"); 
    // hier mit Iterator die Namen der Tiere ausgegeben 
    
  
  } 
}
```


----------



## XHelp (13. Jan 2011)

Hast du selber keinen Ansatz? Irgendwas wirst du doch versucht haben...


----------



## voodoomonkey (13. Jan 2011)

Ja. Das hier:


```
import static jsTools.Input.*; import java.util.*; 
 
class ArrListe<T> implements Iterable{ 
  T elem[]=(T[]) new Object[10]; 
  int pos=0;  // verweist auf das erste freie Element im Array 
 
  void insert(T b) 
  { 
    elem[pos++]=b;  //Einfügen und hochzählen von pos 
  }

  public Iterator iterator(){

// was muss hier noch übergeben oder gemacht werden ?

}
      
  public boolean hasNext()
  {
    return pos < elem.length;
  }

  public Object next()
  {
      return elem[pos++];
    }

  public void remove()
  {
    
  }

}

 
public class Winter09{ 
  static class Tier{ 
    String rasse; 
    String name; 
    Tier (){ 
      rasse = readLine("Kennzeichen"); 
      name  = readLine("Kennzeichen"); 
    } 
  }   
  public static void main(String args[]){ 
    ArrListe<Tier> li=new ArrListe<Tier>(); 
   
    for (int i=0; i<3; i++) 
      li.insert(new Tier()); 
       
    
    System.out.println("Die eingegebenen Tiere sind:"); 
    // hier mit Iterator die Namen der Tiere ausgegeben 
    
    Iterator iterator = li.iterator();
    while (iterator.hasNext())
    {
        System.out.println((String) iterator.next());
    }
	
	 
 
  } 
}
```


Exception in thread "main" Die eingegebenen Tiere sind:
java.lang.NullPointerException
	at P1.Winter09.main(Winter09.java:58)

Er zeigt einfach noch nicht richtig auf den Array. Wo muss ich nachbessern ?


----------



## Landei (13. Jan 2011)

ArrListe ist Iterable (wie du ja schon richtig erkannt hast). hasNext, next u.s.w. müssen aber _in den Iterator_, den ArrList als Iterable zurückgeben muss. Für die Implementierung des Iterators gibt es mehrere Varianten, hier als anonyme Klasse. Wichtig ist, das jedesmal ein neuer "unverbrauchter" Iterator zurückgeliefert wird.

Ungetestet:

```
class ArrListe<T> implements Iterable<T> { 
...
   public Iterator<T> iterator(){
       return new Iterator<T>() {
           private int index = 0;
           public boolean hasNext() { return index < elem.length; }
           public T next() { 
              if (! hasNext()) throw new NoSuchElementException();
              return elem[index++];
           }
           public void remove() {
               throw new UnsupportedOperationException();
           }
       };
   }
...
}
```

Damit kannst du ArrList sogar in erweiterten for-Schleifen verwenden: [c]for(String s : arrList) {...}[/c]


----------



## voodoomonkey (13. Jan 2011)

Vielen Dank. Damit und mit Hilfe eines Kommilitone ergibt sich folgendes. Zwar mit ner kleinen Exception am Schluss aber WAYNE


```
package P1;

import static jsTools.Input.*;
import java.util.Iterator;

class ArrListe<T> implements Iterable<T> {
	T elem[] = (T[]) new Object[10];
	int pos = 0;

	void insert(T b) {
		elem[pos++] = b;
	}

	public Iterator<T> iterator() {
		return new Iterator<T>() {

			int pos = 0;

			public boolean hasNext() {
				return (pos < elem.length - 1);
			}

			public T next() {
				return elem[pos++];
			}

			public void remove() {
				throw new UnsupportedOperationException("Not supported yet.");
			}
		};
	}
}

public class Winter09 {
	static class Tier {
		String rasse;
		String name;

		Tier() {
			rasse = readLine("Kennzeichen");
			name = readLine("Kennzeichen");
		}
	}

	public static void main(String args[]) {
		ArrListe<Tier> li = new ArrListe<Tier>();

		for (int i = 0; i < 3; i++)
			li.insert(new Tier());

		System.out.println("Die eingegebenen Tiere sind:");

		Iterator<Tier> it = li.iterator();

		while (it.hasNext()) {
			System.out.println(it.next().name);
		}
	}
}
```


----------



## Landei (14. Jan 2011)

Ich bin WAYNE. Ich hatte auch einen Denkfehler drinne, man darf nicht von elem.length ausgehen, sondern von pos. Logisch dass da eine Exception fliegt. So sollte es gehen:


```
public Iterator<T> iterator() {
        return new Iterator<T>() {
 
            int index= 0;
 
            public boolean hasNext() {
                return (index < pos);
            }
 
            public T next() {
                //dieser Test und die Exception ist laut JavaDoc von Iterator Pflicht
                if (! hasNext()) {
                       throw new java.util.NoSuchElementException(); 
                }
                return elem[index++];
            }
 
            public void remove() {
                throw new UnsupportedOperationException("Not supported yet.");
            }
        };
    }
```


----------

