/*
Datei............: Aufg0718.java
Projekt..........: Einführung in die Java-Programmierung
Erstellt.........: 02.11.97, Guido Krüger
Geändert.........: --
Aufgabe..........: Musterlösung zu Aufgabe 07.18
Kommentare.......:

Das Implementieren der Klasse SimpleSet erfordert keinen großen
Aufwand. Wir verwenden dazu der Einfachheit halber ein Array fester
Größe, in dem die Werte gespeichert werden können. Das 
Instanzmerkmal length gibt an, wieviele Elemente gerade im 
Array sind. Jeder Aufruf von addElement hängt ein weiteres
Element an das Array an und erhöht length um 1.

Die Methode elements muß definitionsgemäß ein Objekt zurückgegebn,
daß das Interface Enumeration implementiert. Dieses könnte auf 
verschiedene Arten implementiert werden:

- Durch eine separate Klasse
- Durch eine lokale Klasse
- Durch Rückgabe des eigenen Objekts

Wir wählen den ersten Weg, denn er ist am einfachsten zu 
verstehen und wird auch im JDK verwendet (beispielsweise bei
der Klasse java.util.Vector).

Dazu definieren wir eine separate Klasse SimpleSetEnumeration,
die das Interface Enumeration implementiert und die Methoden
hasMoreElements und nextElement zur Verfügung stellt. Das
Interface Enumeration ist im Paket java.util enthalten, das
deshalb am Anfang des Programmes importiert wird.
SimpleSetEnumeration wird ausschließlich von der Methode
elements instanziert, von der es das Array mit den Datenwerten
und seine aktuelle Größe übergeben bekommt. Mit Hilfe eines
Zählers, der bei der Instanzierung auf 0 gesetzt wird, können
nun die Elemente nacheinander durchlaufen werden.

Der Code zur Verwendung der Methode elements ist sehr einfach.
Er weist den Rückgabewert einfach einer Variablen des Typs
Enumeration zu und durchläuft alle ihre Elemente in einer
Schleife. Jeder Aufruf von nextElement gibt das nächste 
Integer-Objekt zurück, das (durch einen impliziten Aufruf
von toString) auf den Bildschirm ausgegeben wird.
*/
import java.util.*;

public class Aufg0718
{
  public static void main(String args[])
  {
	//Set erzeugen
	int value1 = 1;
	int value2 = 1;
	SimpleSet s = new SimpleSet();
	for (int i = 0; i < 20; ++i) {
	  s.addElement(value1);
	  int tmp = value1 + value2;
	  value1 = value2;
	  value2 = tmp;
	}
	//Set ausgeben
	Enumeration e = s.elements();
	while (e.hasMoreElements()) {
	  System.out.println(e.nextElement());
	}
  }
}

class SimpleSet
{
  static final int MAXLENGTH = 100;
  int data[];
  int length;

  public SimpleSet()
  {
	data = new int[MAXLENGTH];
	length = 0;
  }

  public void addElement(int element)
  {
	if (length < MAXLENGTH) {
	  data[length++] = element;
	}
  }

  public Enumeration elements()
  {
	return new SimpleSetEnumeration(data, length);
  }
}

class SimpleSetEnumeration
implements Enumeration
{
  int data[];
  int length;
  int pos;

  public SimpleSetEnumeration(int data[], int length)
  {
	this.data = data;
	this.length = length;
	this.pos = 0;
  }

  public boolean hasMoreElements() 
  {
	return pos < length;
  }

  public Object nextElement() 
  {
	if (hasMoreElements()) {
	  return new Integer(data[pos++]);
	}
	return null;
  }
}

