© 1999-2003, Flemming Koch Jensen
Alle rettigheder forbeholdt
Iterator Pattern

Vejledning løsninger
Opgaver

 

 

1 I denne opgave vil vi iterere over en "pseudo-datastruktur". Pseudo, i den forstand at collection'en reelt ikke indeholder nogen data, men blot beregner dem efterhånden som de bliver efterspurgt.

Collection'en foregiver at have alle fibonacci-tallene, men reelt beregner den dem, hver gang den bliver bedt om et af dem. Alt andet ville også være overraskende, da der er uendelig mange fibonacci-tal.

 

 

Lav en klasse Aggregate med en metode fib, der returnerer det n'te fibonacci-tal, hvor n gives med som parameter til metoden. Du må i den forbindelse gerne anvende en løsning til at finde fibonacci-talene fra en tidligere vejledende løsning.

 

  Lav en klasse Iterator der kan iterere på en instans af Aggregate. Klassen skal have følgende konstruktor og metoder:
Konstruktoren Modtager en reference til en instans af klassen Aggregate, som den skal iterere på.
next Flytter frem til det næste fibonacci-tal.
current Returnerer det nuværende fibonacci-tal.
 

next returnerer ikke noget, da der som sagt er uendelig mange fibonnaci-tal, og vi derfor aldrig kommer til anden af talrækken.

 

 

Lav en metode createIterator i klassen Aggregate, som returnerer en instans af Iterator, der er indstillet til at iterere over instansen af Aggregate.

 

  Lav en testanvendelse der anvender en instans af Iterator til at udskrive de ti første fibonacci-tal.
   
2 [Ikast Handelsskole: Datamatiker - Konstruktions-eksamen, 7/5-1998: Opgave nr. 4]
  Bemærk: Der forventes ikke, at du laver en robust iterator, i denne opgave.
  Der skal i denne opgave arbejdes med en enkeltkædet cirkulær linket liste uden dummy.
  Følgende figur illustrerer hvordan en sådan liste kan se ud; hvis den indeholdt tallene 1, 7, 3 og 5.
Figur 1:
Cirkulær linket liste

Bemærk at listens sidste element ikke har en null-pointer, men i stedet lader sin next pege tilbage på listens første element.
   
2.1

Lav en node-klasse til en enkeltkædet liste, med en data-del der består af en integer. Kald denne klasse Node.

Klassen Node skal ikke indkapsle sine variable. Det er derfor tilladt af bryde indkapslingen i Node, i resten af opgaven.
 
2.2 Lav en liste-klasse med en enkeltkædet cirkulær liste af instanser af klassen Node. Klassen skal have følgende "skelet":
public class List {

  private Node first;
	
  public boolean empty() {
  }

  public Node getFirst() {
  }
	
  public void insert( int v ) {
  }
	
  public void print() {
  }
}
empty Skal returnere boolsk om listen er tom.
getFirst Skal returnere en reference til det første element i listen.
insert Indsætter en instans af Node med værdien v først i den linkede liste.
print Udskriver værdierne i den linkede liste på en linie, med efterfølgende linieskift.
Det bemærkes at metoderne insert og print er besværlige at lave!
 
2.3 Lav en klasse ListIterator. Instanser af klassen ListIterator skal kunne virke som iteratorer på instanser af klassen List. Klassen ListIterator skal have følgende "skelet":
public class ListIterator {

  private List list;
  private Node current; 

  public ListIterator( List l ) {
  }

  public int next() {
  }

  public int move( int n ) {
  }

  public int current() {
  }

  public int reset() {
  }

  public boolean atFirst() {
  }
}
Konstruktoren Modtager en reference til en instans af klassen List, som den skal iterere på.
next Skal flytte en plads frem i listen og returnere den værdi som den nye aktuelle Node indeholder.
move Skal flytte n pladser frem og returnere den værdi som den nye aktuelle Node indeholder.
current Skal returnere den værdi som den aktuelle Node indeholder.
reset Skal flytte til den først Node i listen, og returnere den værdi som denne Node indeholder.
atFirst Skal returnere boolsk om den aktuelle Node er den første i listen.
 
2.4 Lav en metode getIterator til klassen List, der returnerer en instans af ListIterator, der kan iterere på den pågældende instans af List.
 
2.5 Lav en test-klasse, der laver en liste med de fire elementer fra eksemplet ovenfor.
Brug en instans af ListIterator til at beregne og udskrive summen af listens elementer.
   
2.6 Brug, i test-klassen, en instans af ListIterator til at udskrive hvert andet element i listen. Listens første element skal være det første der udskrives. Metoden behøver kun kunne håndtere lister med et lige antal elementer. Du må ikke anvende next-metoden.
 
3 Lav Array-eksemplet, fra kapitlet om Iterator Pattern, så det i stedet anvender Cursor-varianten.
 
4 Udvid eksemplet med den interne ArrayIterator med to ekstra realiseringer af IteratorMethod: klasserne: Adder og Decrementor.
Adder skal lægger et heltal til samtlige elementer. Dette heltal gives med i Adder's konstruktor.
Decrementor skal trække én fra samtlige elementer.