Hilfe beim implementieren von Iterator

voodoomonkey

Mitglied
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 ?


Java:
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 
    
  
  } 
}
 
Ja. Das hier:

Java:
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 ?
 
Zuletzt bearbeitet:
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:
Java:
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]
 
Vielen Dank. Damit und mit Hilfe eines Kommilitone ergibt sich folgendes. Zwar mit ner kleinen Exception am Schluss aber WAYNE

Java:
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);
		}
	}
}
 
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:

Java:
    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.");
            }
        };
    }
 

Neue Themen


Zurück
Oben