You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 2 Next »

java.util.Iterator og java.util.Iterable er to grensesnitt for å henholdsvis opprette en iterator og sikre at en klasse har en iterator.

Mange objekter inneholder samlinger av elementer. Eksempelvis vil et Familie-objekt inneholde en samling av personer, mens et Bibliotek-objekt vil ha en samling av bøker. En Iterator er et objekt som lar deg iterere, altså gå gjennom alle, elementene til et annet objekt. En BibliotekIterator vil kunne gå gjennom alle bøkene i et Bibliotek-objekt, men hvordan dette gjøres vil avhenge av av hvordan BibliotekIteratoren er laget. For eksempel, skal man gå gjennom alle bøkene i alfabetisk rekkefølge, eller skal man gå gjennom bøkene gruppert på forfatter?

java.util.Iterator grensesnittet

Iterator-grensesnittet inneholder 3 metoder:

  • boolean hasNext() - returnerer true hvis det er flere elementer igjen av iterasjonen.
  • <type> next() - returnerer neste element i iterasjonen.
  • void remove() - fjerner det siste elementet som ble returnert av iterasjonen (siden metoden er void, er dette "frivillig").

En Iterator må spesifisere hva slags elementtype den skal iterere over. Dette gjøres ved å implementere Iterator<type>, hvor type er en klasse, f.eks. CardPerson eller Book.

En Iterator for en Library-klasse kan se slik ut:

// OBS: Merk at metodene i denne klassen er uferdige. Logikken i hver metode vil avhenge av hvordan Library-klassen er.
 
import java.util.Iterator;

public class LibraryIterator implements Iterator<Book> {
	private Library library;
	// Eventuelle andre tilstander for å holde styr på iterasjonen
	
	public LibraryIterator(Library library) {
		this.library = library;
		// Sett eventuelle andre tilstander
	}
 
	public boolean hasNext() {
		boolean hasNext = false;
		// Kode for å sjekke om Library har flere Book-objekter
		return hasNext;
	}
 
	public Book next() {
		// Returner neste Book i Library
		return book;
	}
 
	public void remove() {
		// Kode for å fjerne sist returnerte bok eller la stå tom
	}
}

Iterable-grensesnittet

Når et objekt implementerer Iterable-grensesnittet sikrer man at det er mulig å iterere over objektet. Et Iterable<type>-objekt trenger kun å implementere én metode:

  • Iterator<type> iterator() - returnerer en Iterator<type> for å iterere over objektet.

Under følger et eksempel på Library-klassen fra eksempelet over, som implementerer Iterable<Book>:

import java.util.Iterator;
 
public class Library implements Iterable<Book> {
	// Tilstander og andre metoder i klassen er ikke definert her
	
	public Iterator<Book> iterator() {
		return new LibraryIterator(this);
	}
}

I mange tilfeller bruker vi ArrayList eller andre typer lister som allerede implementerer Iterator-grensesnittet. Dette kan vi utnytte i nye klasser:

import java.util.Iterator;
 
public class Library implements Iterable<Book> {
	private ArrayList<Book> books;
	// Andre tilstander og metoder i klassen er ikke definert her
	
	public Iterator<Book> iterator() {
		// Returnerer ArrayList's iterator
		return books.iterator();
	}
}

Fordeler med Iterator / Iterable

Når et objekt implementerer Iterable<type> kan man bruke for-løkker av denne typen:

for (TypeObject element : IterableObject) {
	// Her går vi gjennom alle elementer i IterableObject-objektet, som inneholder TypeObject-objekter
}

I en liste eller andre objekter hvor elementerer har en definert rekkefølge er naturlig å iterere over objekter fra første element til siste element. I noen typer objekter er det derimot ikke like åpenbart hvilket element som skal hentes i neste iterasjon. I en matrise kan eksempelvis itereres over rad for rad eller kolonne for kolonne. Ved å lage en egen Iterator kan man spesifisere dette selv. Man kan også lage flere iteratorer for ett enkelt objekt. 

Ferdig
90
  • No labels