© 1999-2003, Flemming Koch Jensen
Alle rettigheder forbeholdt
Iterator Pattern
Vejledende løsninger

 

 

1  
public class Aggregate {
  
  public Iterator createIterator() {
    return new Iterator( this );
  }
  
  // PRE: n >= 0
  public int fib( int n ) {
    if ( n < 2 )
      return 1;
    else
      return fib( n - 2 ) + fib( n - 1 );
  }
}
 
public class Iterator {
  private Aggregate aggregate;
  private int position;
  
  public Iterator( Aggregate aggregate ) {
    this.aggregate = aggregate;
    
    position = -1; // before first
  }

  public void next() {
    position++;
  }
  
  public int current() {
    return aggregate.fib( position );
  }
}
 
public class Main {
  
  public static void main( String argv[] ) {
    Aggregate aggregate = new Aggregate();
    
    Iterator iterator = aggregate.createIterator();
    
    for ( int i=0; i<10; i++ ) {
      iterator.next();
      System.out.println( iterator.current() );
    }
  }
}

1
1
2
3
5
8
13
21
34
55
   
2  
public class Node {
  public int value;
  public Node next;
}
 
public class List {
  private Node first;
  
  public boolean empty() {
    return first == null;
  }
  
  public Node getFirst() {
    return first;
  }
  
  public void insert( int v ) {
    Node n = new Node();
    n.value = v;
    
    if ( first == null ) {
      first = n;
      n.next = first;
    } else {
      n.next = first;

      Node tmp;
      for ( tmp = first; tmp.next != first; tmp = tmp.next ) ;
      
      tmp.next = n;
      first = n;
    }
  }
  
  public void print() {
    if ( first != null ) {
      System.out.print( first.value + " " );
      
      for ( Node tmp = first.next; tmp != first; tmp = tmp.next )
        System.out.print( tmp.value + " " );
        
      System.out.println();
    }
  }
}
 
public class ListIterator {
  private List list;
  private Node current;
  
  public ListIterator( List list ) {
    this.list = list;

    current = list.getFirst();
  }
  
  public int next() {
    if ( current != null )
      current = current.next;
      
    return current();
  }
  
  public int move( int n ) {
    for ( int i=0; i<n; i++ )
      next();
      
    return current();
  }
  
  public int current() {
    if ( current != null )
      return current.value;
    else
      return -1;
  }
  
  public int reset() {
    current = list.getFirst();
    
    return current();
  }
  
  public boolean atFirst() {
    return current == list.getFirst();
  }
}
 
public class Main {
  
  public static void main( String argv[] ) {
    List list = new List();
    
    list.insert( 5 );
    list.insert( 3 );
    list.insert( 7 );
    list.insert( 1 );
    list.print();
    
    /*
     *   Beregne summen af elementerne
     */
    ListIterator it = new ListIterator( list );
    
    int sum = 0;
    do {
      sum += it.next();
    } while ( !it.atFirst() );
    
    System.out.println( "Sum: " + sum );
    
    /*
     *   Udskrive hver anden af elementerne
     */
    it.reset();
    
    do {
      System.out.println( it.current() );
      it.move( 2 );
    } while ( !it.atFirst() );
  }
}

1 7 3 5
Sum: 16
1
3
 
3  
package array;

public class Cursor {
  private int pos;
  
  protected Cursor( int pos ) {
    setPos( pos );
  }
  
  protected void setPos( int pos ) {
    this.pos = pos;
  }
  
  protected int getPos() {
    return pos;
  }
  
  protected void incPos() {
    pos++;
  }
  
  protected void decPos() {
    pos--;
  }
}
 
package array;

public class ArrayAggregate {
  private int[] array;
  
  public ArrayAggregate( int[] array ) {
    this.array = array;
  }
  
  public Cursor createCursor() {
    return new Cursor( -1 );
  }
  
  public boolean next( Cursor cursor ) {
    if ( cursor.getPos() + 1 < array.length ) {
      cursor.incPos();
      return true;
    } else
      return false;
  }
  
  public int current( Cursor cursor ) {
    return array[ cursor.getPos() ];
  }
}
 
import array.*;

public class Main {

  public static void main( String[] argv ) {
    int[] list = { 2, 3, 5, 7, 11, 13, 17, 19  };
  
    ArrayAggregate aggregate = new ArrayAggregate( list );
  
    // Klient start
  
    Cursor cursor = aggregate.createCursor();
  
    while ( aggregate.next( cursor ) )
      System.out.print( aggregate.current( cursor ) + " " );
      
    System.out.println();  
  
    // Klient slut
  }
}
2 3 5 7 11 13 17 19
   
4  
import array.*;

public class Adder implements IteratorMethod {
  private int adder;
  
  public Adder( int adder ) {
    this.adder = adder;
  }
  
  public int operation( int value ) {
    return value + adder;
  }
}
 
import array.*;

public class Decrementor implements IteratorMethod {
  
  public int operation( int value ) {
    return value - 1;
  }
}