9. Objektdiagramm der Reihungsimplementierung Inhaltsverzeichnis 11. Implementierung mit verketteten Listen

10. Flexible Reihung

Die Größe des Reihungsobjekts kann zur Laufzeit nach der Erzeugung nicht mehr verändert werden. Wenn die im aktuellen Klassenparameter angegebene Größe nicht ausreicht, wird von der obigen Implementierung die Ausnahme IllegalStateException ausgelöst. Dieser kann vorgebeugt werden, indem vor add mit der Methode isFull abgefragt wird, ob die Kapazität für ein weiteres Element ausreichen wird.

Eine alternative Implementierung ist vorstellbar, in der add anstatt eine Ausnahme auszulösen, ein neues Reihungsobjekt mit doppelter Größe erzeugt und die Elemente hinüberkopiert werden, etwa so:

if (isFull) { // neue Reihung mit doppelter Länge erzeugen

   val temp = new Array[Object](2 * anzahl).asInstanceOf[Array[E]]

   for (i <- 0 until anzahl)

     temp(i) = inhalt((ältestes + i) % inhalt.length)

   inhalt = temp // neue Reihung verwenden

   ältestes = 0

   jüngstes = anzahl-1 }

Nachteilig ist bei dieser Lösung, dass die vergrößerte Reihung nicht mehr verkleinert wird, falls die vergrößerte Kapazität nicht mehr benötigt wird[1].

Besser ist, eine teuere[2] (private oder veröffentlichte) Methode pack zu haben, die die Speichergröße auf den gegebenen Wert (zurück-) setzt:

def pack(größe: Int) = {

   val temp = new Array[Object](größe).asInstanceOf[Array[E]]

   for (i <- 0 until anzahl)

     temp(i) = inhalt((ältestes + i) % inhalt.length)

   inhalt = temp; // neue Reihung verwenden

   ältestes = 0;

   jüngstes = anzahl-1; }

def pack: Unit = // setzt aufs Minimum

   pack(anzahl)

Diese kann dann gegebenenfalls entweder von add (wenn private, etwa mit aktuellem Parameter 2*anzahl) oder vom Benutzer (wenn öffentlich) aufgerufen werden.

9. Objektdiagramm der Reihungsimplementierung Inhaltsverzeichnis 11. Implementierung mit verketteten Listen

[1] ggf. muss hierfür eine Methode pack vereinbart und vom Benutzer aufgerufen werden

[2] Die bisherigen Methoden hatten alle eine konstante Zeitkomplexität: Ihr Zeitaufwand hing nicht von der Anzahl der Elemente ab. Das Kopieren aller Elemente erfordert aber eine lineare Zeitkomplexität.


Version: 5. Dezember 2010

© Prof. Solymosi, 2010, Beuth-Hochschule für Technik Berlin