Noch mehr Java gibts auf www.javahochzwei.de

Eigener Iterator

Während der Programmentwicklung kann es vorkommen, dass man eine eigene Klasse geschrieben hat, die man mit Hilfe eines Iterators bearbeiten möchte.

Dies ist kein Problem in Java, es ist sogar relativ einfach!

Hierzu schauen wir uns zuerst das Interface Iterable aus der Java API an:

Das Interface Iterable muss implementiert werden, wenn man unsere eigene Klasse „durchiterieren“ können soll. Wie wir sehen, muss die einzige Methode von Iterable

Iterator<T> 	iterator()
                        Returns an iterator over a set of elements of type T.

einen Iterator zurückgeben, also eine Implementierung der Klasse java.util.iterator!

Dies lässt sich ganz einfach umsetzen:

	@Override
	public Iterator<String> iterator() {
		Iterator<String> iterator = new Iterator<String>() {

			@Override
			public boolean hasNext() {

			}

			@Override
			public String next() {

			}

			@Override
			public void remove() {

			}
		};
		return iterator;
	}

Natürlich müssen wir den Methoden von Iterator, die wir überschreiben, noch Leben einhauchen. Was wir hier genau implementieren, ist natürlich davon abhängig, wie unsere Klasse beschaffen ist, bzw. arbeitet. Dies muss jeder Programmierer, der an dem Punkt eines eigenen Iterators steht, selbst entscheiden!

Ich für meinen Teil habe meiner Klasse der einfachheithalber ein Vectorzugrunde gelegt und benutze in den überschriebenen Methoden jeweils die Methoden, die mir die Klasse Vector zur Verfügung stellt:

package eigenerIterator;

import java.util.Iterator;
import java.util.Vector;

/**
 * @author Armin
 * @since 19.09.2012
 * 
 * info@prog-blog.de
 * www.prog-blog.de 
 */
public class EigenerIterator implements Iterable<String> {

	private Vector<String> daten;
	private int counter;

	public EigenerIterator(Vector<String> daten) {
		this.daten = daten;
		this.counter = 0;
	}

	@Override
	public Iterator<String> iterator() {
		Iterator<String> iterator = new Iterator<String>() {

			@Override
			public boolean hasNext() {

				if (counter < daten.size()) {
					return true;
				} else {
					return false;
				}
			}

			@Override
			public String next() {

				return daten.get(counter++);
			}

			@Override
			public void remove() {

				daten.remove(counter);
			}
		};

		return iterator;
	}
}

Nun brauche ich nur noch eine Klasse, aus der ich meinen eigenen Iterator testen kann:

package eigenerIterator;

import java.util.Iterator;
import java.util.Vector;

/**
 * @author Armin
 * @since 19.09.2012
 * 
 * info@prog-blog.de
 * www.prog-blog.de 
 */
public class EigenerIteratorTest {

	public static void main(String[] args) {

		Vector<String> behälter = new Vector<String>();

		behälter.add("Dies");
		behälter.add("ist");
		behälter.add("ein");
		behälter.add("Iterator-Test");
		behälter.add("von");
		behälter.add("www.prog-blog.de");

		EigenerIterator eig_it = new EigenerIterator(behälter);

		Iterator<String> it = eig_it.iterator();

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

Die Ausgabe ist wie gewollt:

Dies
ist
ein
Iterator-Test
von
www.prog-blog.de

Ich hoffe, dass ihr mit den Beispielen was anfangen könnt und somit selbst in der Lage seid, einen eigenen Iterator für Eure Klasse zu schreiben!

Quelltext herunterladen:

  eigenerIterator.rar (954 bytes, 71 hits)

Eine Einführung zum Thema Iteratoren findest Du hier!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.