Benutzer:PascalHänle/Grundvorstellungen zum Ableitungsbegriff/Zusammenfassung Grundvorstellungen zum Ableitungsbegriff und Java/List: Unterschied zwischen den Seiten

Aus ZUM-Unterrichten
 
main>Karl Kirst
K (Kasten blass -> blau)
 
Zeile 1: Zeile 1:
{{Box|Info|
==Erster Implementierungsansatz==
Auf dieser Seite finden Sie die Grundvorstellungen, die Sie sich in diesem Lernpfad selbst erschließen können in einer detaillierten Zusammenfassung. Die Zusammenfassung können Sie auch als PDF oder Word Dokument herunterladen.
* ??? Wahrscheinlich ist der Positionszähler nicht so gemeint. Er soll anscheinend selbst ein Listenelement sein. Besitzt jemand einen stimmigen Quelltext?
|Kurzinfo}}


==Die Ableitung==
===Mögliche Interpretation===
überschneidungen, keine getrennt zu betrachten, Differenzierbar, zwei mathematische definitionen
Realisiert mit ArrayList:
<source lang="java">
import java.util.ArrayList;


===Die Ableitung als lokale (momentane) Änderungsrate===
public class List {
Die Grundvorstellung der Ableitung als lokale oder auch momentane Änderungsrate baut auf dem Verständnis von Änderungsprozessen auf, die bereits in der Sekundarstufe 1 behandelt wurden. Es wird nun also neben der absoluten Änderung und der mittleren (durchschnittlichen) Änderungsrate auch die lokale Änderungsrate beschrieben. 
private ArrayList liste;
private int positionszeiger;


Wie auch in der Bearbeitung des Lernpfades lässt sich diese Grundvorstellung am besten mit einem Weg-Zeit-Zusammenhang erschließen.
public List(){
  liste = new ArrayList(); // die Liste ist leer
  positionszeiger=-1; // der Positionszeiger steht vor der Liste
}


So entspricht im Kontext eines Weg-Zeit-Zusammenhangs die '''absolute Änderung''' der '''Wegzunahme''' <math>f(x_1)-f(x_0)</math>vom Zeitpunkt <math>x_0
public void insertBefore (Object pObject)
</math>bis <math>x_1</math>die '''mittlere Änderungsrate''' <math>\frac{f(x_1)-f(x_0)}{x_1-x_0} </math>der '''mittleren (durchschnittlichen) Geschwindigkeit''' im Intervall <math>[x_0,x_1]</math>. Da sich die mittlere Änderungsrate über ein Steigungsdreieck, also über den Differenzenquotienten berechnen lässt, ist sie graphisch mit der Steigung der Sekante zu deuten. 
  liste.add(positionszeiger, pObject);
  positionszeiger--;
}


Durch sukzessive Verkleinerung dieses Intervalls lässt sich dann dem genäherten x-Wert eine '''lokale (momentane) Änderungsrate''' <math>f'(x_0) = \lim_{x_1\to x_0} \frac{f(x_1)-f(x_0)}{x_1-x_0}</math>zuschreiben, die der '''momentanen Geschwindigkeit entspricht.''' Die Verkleinerung des Intervalls kann sowohl tabellarisch (siehe Aufgabe ??) als auch graphisch-dynamisch (siehe Aufgabe ??) erfolgen. Die lokale Änderungsrate ist dementsprechend graphisch als die '''Steigung des Graphen an der Stelle''' <math>x_0
public void insertBehind (Object pObject){  
</math>, also der '''Steigung der Tangente''' im Berührpunkt <math>P(x_0|f(x_0) </math>zu interpretieren. 
  liste.add(positionszeiger+1, pObject);
}


public void update (Object pObject){ 
  liste.set(positionszeiger, pObject);
}


Bilder hinzufügen.
public void delete (){ 
  liste.remove(positionszeiger);
}


===Die Ableitung als Steigung der Tangente===
public void next(){
  if (positionszeiger!=liste.size()) positionszeiger++;
}


Wie der Name schon sagt, ist bei dieser Grundvorstellung die Ableitung als Steigung der Tangente zu interpretieren. Es gilt also  die bereits vorhandene Vorstellung der Tangente, die im Zusammenhang mit Kreisen erworben wurde, auf das Analytische zu erweitern.
public void previous(){
  if (positionszeiger>-1) positionszeiger--;
}


In der Kreisgeometrie der Sekundarstufe 1 wurde die Tangente als eine Gerade definiert, die genau einen gemeinsamen Punkt (Berührpunkt) mit dem Kreis hat. In der Analysis hingegen ist die Tangente von <math>f</math> an der Stelle <math>x_0</math>die Gerade, die den Graphen von <math>f</math>berührt und die gleiche Steigung wie <math>f</math>an dieser Stelle hat.
public void toFirst(){
  positionszeiger=0;
}


Die Ableitung <math>f'(x_0)</math> entspricht also der Steigung von <math>f</math>an der Stelle <math>x_0</math>und ebenso der Steigung der Tangente von <math>f</math>an der Stelle <math>x_0</math>. Veranschaulichen lässt sich dies durch das Funktionenmikroskop (Aufgabe ??), das bei starkem Hineinzoomen in einen Graph zeigt wie sich die Tangente an den Graphen anschmiegt und letztlich nicht mehr von ihm zu unterscheiden ist.
public void toLast(){
  positionszeiger=liste.size()-1;
}


3 Bilder einfügen.  
public Object getItem(){
  if (liste.size()==0 || positionszeiger==-1 || positionszeiger>=liste.size())
    return null;
  else return liste.get(positionszeiger);
}


Hergeleitet wird die Ableitung, also die Steigung der Tangente bei dieser Grundvorstellung über die Steigung von Sekanten. Die Steigung der Sekante durch zwei Punkte <math>P(x_0|f(x_0) </math>und <math>Q(x_1|f(x_1) </math>eines Funktionsgraphen kann mittels Steigungsdreieck und Differenzenquotienten <math>\frac{f(x_1)-f(x_0)}{x_1-x_0} </math> leicht berechnet werden. Lässt man nun den Abstand zwischen <math>x_1</math>und <math>x_0</math>immer kleiner werden, so erhält man die Steigung die der Graph in diesem endlos verkleinerbaren Intervall <math>[x_0,x_1]</math>hat. Es entsteht also letztendlich die punktuelle Steigung des Graphen an der genäherten x-Stelle. Graphisch-dynamisch lässt sich dies durch die Näherung der zwei Punkte <math>P</math>und <math>Q</math> visualisieren (Aufgabe ??). Es entsteht eine Gerade, die den Graphen lediglich berührt und die gleiche Steigung wie der Graph an der genährten x-Stelle hat. Die Tangente. Als die Steigung der Tangente ergibt sich somit der Grenzwert des Differenzenquotienten <math> \lim_{x_1\to x_0} \frac{f(x_1)-f(x_0)}{x_1-x_0}</math>, also die Ableitung <math>f'(x_0)</math>.   
public boolean isEmpty (){  
  return (liste.size()==0);
}


===Die Ableitung als lokale lineare Approximation===
public boolean isBefore (){ 
Um zu erläutern welche Rolle die Ableitung bei der lokalen linearen Approximation einer Funktion einnimmt, wird zunächst geklärt wie sich Funktion lokal, also in sehr kleinen Umgebungen verhalten.
  return (positionszeiger<0);
}


Zoomt man in verschiedene Funktionen hinein so erkennt man, dass sich Funktionen einerseits lokal linear, also geradlinig oder oder andererseits nicht linear verhalten können (Aufgabe ??).
public boolean isBehind ()
  return (positionszeiger>=liste.size());
}


Verhält sich eine Funktionen <math>f</math>an einer Stelle <math>x_0</math>lokal linear, so existiert an dieser Stelle auch die Ableitung <math>f'(x_0)</math>. {{Lösung versteckt|Da sich in einem lokal linearen Teilausschnitt des Graphen der Abstand zwischen <math>x_0</math> und <math>x_1</math> beliebig stark verkleinern lässt, existiert der Grenzwert des Differenzenquotienten und die Funktion <math>f</math> besitzt an der genäherten Stelle eine Ableitung. |genauer erklärt|ausblenden}}
}
</source>


;Korrekturen:
11.09. - insertBehind: Positionszeiger wird vor und zurück gestellt
http://informatik.zum.de/pieper/blog/index.php?entry=entry060828-105313


Der Graph der Linearisierung der Funktion <math>f</math>um die Stelle <math>x_0</math>ist dann die Tangente von <math>f</math>an der Stelle <math>x_0</math>.<br />
==Zweiter Implementierungsansatz OOP pur==
* ??? Wahrscheinlich ist der Positionszeiger aus Delphi entlehnt und nicht sauber auf Java übertragbar. Hier mein Versuch es mit möglichst reinem OOP zu versuchen (bitte auf die Basisklasse ListElement achten).
 
<source lang="java">
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
 
/**
* '''Bestandteil des Zentralabiturs 2009'''<br>
* <br>
* Objekte der Klasse List verwalten beliebige Objekte nach einem Listenprinzip. Ein
* interner Positionszeiger wird durch die Listenstruktur bewegt, seine Position markiert
* ein aktuelles Objekt. Die Lage des Positionszeigers kann abgefragt, verändert und die
* Objektinhalte an den Positionen können gelesen oder verändert werden. Die Klasse Stack
* stellt Methoden in folgender Syntax zur Verfügung:
* <ul>
* <li>public List()</li>
* <li>public boolean isEmpty()</li>
* <li>public boolean isBefore()</li>
* <li>public boolean isBehind()</li>
* <li>public void next()</li>
* <li>public void previous()</li>
* <li>public void toFirst()</li>
* <li>public void toLast()</li>
* <li>public Object getItem()</li>
* <li>public void update (Object pObject)</li>
* <li>public void insertBefore (Object pObject)</li>
* <li>public void insertBehind (Object pObject)</li>
* <li>public void delete()</li>
* </ul>
* ''' Nicht Bestandteil des Zentralabiturs 2009''' - dient der praktischen Anwendung<br>
* <ul>
* <li>public clone()</li>
* <li>public load(String fileName)</li>
* <li>public save(String fileName)</li>
* </ul>
*
* @author <a href="mailto:schule@dinro.de">DiNaro</a>
* @version 1.0z+ 2006-09-12
*/
public class List implements Cloneable, Serializable
{
/**
* Attribut dient zur Serialisierung.
*/
private static final long serialVersionUID = 1087406856309777647L;
/**
* Attribut der Positionszeiger befindet sich vor der Liste (Flag).
*/
private boolean before;
 
/**
* Attribut der Positionszeiger befindet sich hinter der Liste (Flag).
*/
private boolean behind;
 
/**
* Attribut aktuelles Element.
*/
private ListElement current;
 
/**
* Attribut erstes Element der Liste
*/
private ListElement first;
 
/**
* Attribut letztes Element der Liste.
*/
private ListElement last;
 
/**
* Der Konstruktor erzeugt eine leere lineare Liste.<br>
* <br>
*
* <pre>
* Konstruktor  List()
* <br>
* Nachher      Eine leere Liste ist angelegt.
*              Der interne Positionszeiger steht vor der leeren Liste.
* </pre>
*/
public List()
{
this.first = null;
this.last = null;
this.current = null;
this.before = true;
this.behind = false;
}
 
/**
* Kopiert die Liste - '''Nicht Bestandteil des Zentralbiturs 2009!!!'''<br>
* ("shallow copy" nach dem Handbuch der Java Programmierung Kapitel 9.4.2).
*
* @return kopierte lineare Liste
* @throws CloneNotSupportedException kann nicht auftreten, aber der Compiler will es
*          so...
*/
@Override
public List clone() throws CloneNotSupportedException
{
try
{
return (List) super.clone();// "shallow copy"
}
catch (CloneNotSupportedException e)
{ // Kann nicht auftreten, aber der Compiler will es so...
throw new CloneNotSupportedException(e.toString());
}
}
 
/**
* Löscht des aktuellen Listenelement.<br>
* <br>
*
* <pre>
* Auftrag      delete()
* Vorher      Der Positionszeiger steht nicht vor oder hinter der Liste.
* Nachher      Das aktuelle Listenelement ist gelöscht. Der Positionszeiger steht auf
*              dem Element hinter dem gelöschten Element, bzw. hinter der Liste,
*              wenn das gelöschte Element das letzte Listenelement war.
* </pre>
*/
public void delete()
{
if (!this.before && !this.behind)
{ // Zeiger des Vorgängerelementes setzen
if (this.current == this.first)
{ // Vorgänger existiert nicht - Kopfzeiger korregieren
this.first = this.current.getNext();
}
else
{ // Vorgänger existiert
this.current.getPrevious().setNext(this.current.getNext());
}
// Zeiger des Nachfolgerelementes setzen
if (this.current == this.last)
{ // Nachfolger existiert nicht - Scxhwanzzeiger korreegieren
this.last = this.current.getPrevious();
}
else
{ // Nachfolger existiert
this.current.getNext().setPrevious(this.current.getPrevious());
}
// aktuelles Element setzen
this.current = this.current.getNext();
// Flag für Positionszeiger befindet sich hinter der Liste setzen
this.behind = this.current == null;
}
}
 
/**
* Gibt den Inhalt des aktuellen Listenelementes zurück, ohne die Liste zu verändern.<br>
* <br>
*
* <pre>
* Anfrage      getItem(): Object
* Nachher      Die Anfrage liefert den Wert des aktuellen Listenelements bzw. null,
*              wenn die Liste keine Elemente enthält, bzw. der Positionszeiger
*              vor oder hinter der Liste steht.
* </pre>
*
* @return item Inhalt des aktuellen Listenelementes.
*/
public Object getItem()
{
if (this.current != null)
{
return this.current.getItem();
}
else
{
return null;
}
}
 
/**
* Einfügen eines Listenelementes vor das aktuelle.<br>
* <br>
*
* <pre>
* Auftrag      insertBefore (Object pObject)
* Vorher        Der Positionszeiger steht nicht vor der Liste.
* Nachher      Ein neues Listenelement mit dem entsprechenden Objekt ist angelegt und
*              vor der aktuellen Position in die Liste eingefügt worden.
*              Der Positionszeiger steht hinter dem eingefügten Element.
* </pre>
*
* @param pObject Inhalt des Listenelementes.
*/
public void insertBefore(Object pObject)
{
if (!this.before)
{ // Der Positionszeiger steht nicht vor der Liste.
ListElement newElement;
if (this.isEmpty())
{ // Erstes und einziges Element in die Liste einfügen
newElement = new ListElement(pObject, null, null);
this.first = newElement;
this.last = newElement;
this.behind = true;
this.current = null;
}
else
{ // Die Liste ist nicht leer
if (this.behind)
{ // Der Positionszeiger steht hinter der Liste
newElement = new ListElement(pObject, this.last, null);
this.last.setNext(newElement);
this.last = newElement;
this.behind = true;
this.current = null;
}
else
{ // Der Positionszeiger steht mitten in der Liste
newElement = new ListElement(pObject, this.current.getPrevious(), this.current);
if (this.current == this.first)
{ // Vorgänger existiert nicht - Kopfzeiger korregieren
this.first = newElement;
}
else
{ // Vorgänger koregieren
this.current.getPrevious().setNext(newElement);
}
// Nachfolger korregieren
this.current.setPrevious(newElement);
// Aktuelles Element bleibt aktuelles Element
}
}
}
}
 
/**
* Einfügen eines Listenlementes hinter das aktuelle.<br>
* <br>
*
* <pre>
* Auftrag      insertBehind (Object pObject)
* Vorher        Der Positionszeiger steht nicht hinter der Liste.
* Nachher      Ein neues Listenelement mit dem entsprechenden Objekt ist angelegt
*              und hinter der aktuellen Position in die Liste eingefügt worden. Der
*              Positionszeiger steht vor dem eingefügten Element.
* </pre>
*
* @param pObject Inhalt des Listenelementes.
*/
public void insertBehind(Object pObject)
{
if (!this.behind)
{ // Der Positionszeiger steht nicht hinter der Liste.
ListElement newElement;
if (this.isEmpty())
{// Erstes und einziges Element in die Liste einfügen
newElement = new ListElement(pObject, null, null);
this.first = newElement;
this.last = newElement;
this.before = true;
this.current = null;
}
else
{ // Die Liste ist nicht leer
if (this.before)
{ // Der Positionszeiger steht vor der Liste.
newElement = new ListElement(pObject, null, this.first);
this.first.setPrevious(newElement);
this.first = newElement;
this.before = true;
this.current = null;
}
else
{ // Der Positionszeiger steht mitten in der Liste.
newElement = new ListElement(pObject, this.current, this.current.getNext());
if (this.current == this.last)
{ // Nachfolger existiert nicht - Schwanzzeiger korregieren
this.last = newElement;
}
else
{ // Nachfolger korregieren
this.current.getNext().setPrevious(newElement);
}
// Vorgänger koregieren
this.current.setNext(newElement);
// Aktuelles Element bleibt aktuelles Element
}
}
}
}
 
/**
* Steht der Positionszeiger vor der Liste?<br>
* <br>
*
* <pre>
* Anfrage      isBefore(): boolean
* Nachher      Die Anfrage liefert den Wert true, wenn der Positionszeiger vor dem
*              ersten Listenelement oder vor der leeren Liste steht, sonst liefert
*              sie den Wert false.
* </pre>
*
* @return liefert den Wert true, wenn der Positionszeiger vor dem ersten Listenelement
*        oder vor der leeren Liste steht, sonst liefert sie den Wert false.
*/
public boolean isBefore()
{
return this.before;
}
 
/**
* Steht der Positionszeiger hinter der Liste?<br>
* <br>
*
* <pre>
* Anfrage      isBehind(): boolean
* Nachher      Die Anfrage liefert den Wert true, wenn der Positionszeiger hinter dem
*              letzten Listenelement oder hinter der leeren Liste steht, sonst liefert
*              sie den Wert false.
* </pre>
*
* @return liefert den Wert true, wenn der Positionszeiger hinter dem letzten
*        Listenelement oder hinter der leeren Liste steht, sonst liefert sie den Wert
*        false.
*/
public boolean isBehind()
{
return this.behind;
}
 
/**
* Enthält die Liste keine Elemente?<br>
* <br>
*
* <pre>
* Anfrage      isEmpty(): boolean
* Nachher      Die Anfrage liefert den Wert true, wenn die Liste keine Elemente
*              enthält, sonst liefert sie den Wert false.
* </pre>
*
* @return liefert den Wert true, wenn die Liste keine Elemente enthält, sonst liefert
*        sie den Wert false.
*/
public boolean isEmpty()
{
return this.first == null;
}
 
/**
* Lädt die gesamte Liste als Objekt aus einer Datei - <b>Nicht Bestandteil des
* Zentralbiturs 2009!!!</b><br>
* Neues aktuelles Element wird das erste Listenelement(Setzung!).
*
* @param fileName [Laufwerk][Pfad]Dateiname,
* @throws ClassNotFoundException Erwartete Klasse nicht vorhanden
* @throws IOException Fehler beim Laden der Datei
*/
public void load(final String fileName) throws ClassNotFoundException, IOException
{
try
{
final ObjectInputStream stream = new ObjectInputStream(
new FileInputStream(fileName));
final List dummy = (List) stream.readObject();
this.first = dummy.first;
this.last = dummy.last;
this.before = dummy.before;
this.behind = dummy.behind;
this.toFirst(); // Als neues aktuelles Element wird das erste Listenelement gesetzt!
stream.close();
}
catch (final ClassNotFoundException e)
{ // Erwartete Klasse nicht vorhanden.
throw new ClassNotFoundException(e.toString());
}
catch (final IOException e)
{ // Fehler beim Laden der Datei.
throw new IOException(e.toString());
}
}
 
/**
* Setze das aktuelle Listenelement auf das nächste. <br>
* <br>
*
* <pre>
* Auftrag      next()
* Nachher      Der Positionszeiger ist um eine Position in Richtung Listenende weiter-
*              gerückt, d.h. wenn er vor der Liste stand, wird das Element am
*              Listenanfang zum aktuellen Element, ansonsten das jeweils nachfolgende
*              Listenelement. Stand der Positionszeiger auf dem letzten Listenelement,
*              befindet er sich jetzt hinter der Liste. Befand er sich hinter der
*              Liste, hat er sich nicht verändert.
* </pre>
*/
public void next()
{
if (!this.isEmpty())
{
if (this.before)
{ // Der Positionszeiger steht vor der Liste; das erste Element wird aktuelles
this.current = this.first;
this.before = false;
}
else
{ // der Positionszeiger steht nicht vor der Liste
if (this.current != null)
{ // das jeweils nachfolgende Listenelement wird aktuelles
this.current = this.current.getNext();
if (this.current == null)
{ // Der Positionszeiger zeigt hinter das letzte Element
this.behind = true;
}
}
} // Der Positionszeiger befindet sich hinter der Liste und bleibt unverändert
}
}
 
/**
* Setze das aktuelle Listenelement auf das vorherige.<br>
* <br>
*
* <pre>
* Auftrag      previous()
* Nachher      Der Positionszeiger ist um eine Position in Richtung Listenanfang
*              weitergerückt, d.h. wenn er hinter der Liste stand, wird das Element am
*              Listenende zum aktuellen Element, ansonsten das jeweils vorhergehende
*              Listenelement. Stand der Positionszeiger auf dem ersten Listenelement,
*              befindet er sich jetzt vor der Liste. Befand er sich vor der Liste, hat
*              er sich nicht verändert.
* </pre>
*/
public void previous()
{
if (!this.isEmpty())
{ /// Der Positionszeiger bleibt unverändert, wenn die Liste leer ist
if (this.behind)
{ // Der Positionszeiger steht hinter der Liste; das letzte Element wird aktuelles
this.current = this.last;
this.behind = false;
}
else
{// Der Positionszeiger steht nicht hinter der Liste
if (this.current != null)
{ // das jeweils vorhergehende Listenelement wird aktuelles
this.current = this.current.getPrevious();
if (this.current == null)
{ // Der Positionszeiger zeigt vor das erste Element
this.before = true;
}
}
} // Der Positionszeiger befindet sich vor der Liste und bleibt unverändert
}
}
 
/**
* Speichert die gesamte Liste als Objekt in einer Datei - <b>Nicht Bestandteil des
* Zentralbiturs 2009!!!</b><br>
* Das aktuelles Element bleibt erhalten!
*
* @param fileName [Laufwerk][Pfad]Dateiname.
* @throws IOException Fehler beim Speichern der Datei
*/
public void save(String fileName) throws IOException
{
try
{
ObjectOutputStream stream = new ObjectOutputStream(new FileOutputStream(fileName));
stream.writeObject(this);
stream.close();
}
catch (IOException e)
{ // Fehler beim Speichern der Datei.
throw new IOException(e.toString());
}
}
 
/**
* Setzt das aktuelle Listenelement auf das erste zurück.<br>
* <br>
*
* <pre>
* Auftrag      toFirst()
* Nachher      Der Positionszeiger steht auf dem ersten Listenelement.
*              Falls die Liste leer ist befindet er sich jetzt hinter der Liste.
* </pre>
*/
public void toFirst()
{
this.current = this.first;
this.before = false;
this.behind = this.isEmpty();
}
 
/**
* Setzt das aktuelle Listenelement auf das letzte zurück.<br>
* <br>
*
* <pre>
* Auftrag      toLast()
* Nachher      Der Positionszeiger steht auf dem letzten Listenelement.
*              Falls die Liste leer ist befindet er sich jetzt vor der Liste.
* </pre>
*/
public void toLast()
{
this.current = this.last;
this.behind = false;
this.before = this.isEmpty();
}
 
/**
* <pre>
* Auftrag      update (Object pObject)
* Vorher        Die Liste ist nicht leer. Der Positionszeiger steht nicht vor oder
*              hinter der Liste.
* Nachher      Der Wert des Listenelements an der aktuellen Position ist durch pObject
*              ersetzt.
* </pre>
*
* @param pObject neuer Wert des Listenelements
*/
public void update(Object pObject)
{ // Die Liste ist nicht leer. Der Positionszeiger steht nicht vor oder hinter der
// Liste.
if (!this.isEmpty() && !this.before && !this.behind)
{ // Die Liste ist nicht leer. Der Positionszeiger steht nicht vor oder hinter der Liste.
this.current.setItem(pObject);
}
}
 
}
////////////////////////////////// Basisklasse ListElement /////////////////////////////////
import java.io.Serializable;
 
/**
* Datei ListElement.java (Klasse Listelement mit generalisiertem Datentyp Object).<br>
* <br>
* Die Klasse ListElement ist die '''Basisklasse für doppelt verkette Listen'''.<br>
* <br>
* Ein ListElement enthält eine Date, einen Verweis auf den Vorgänger und einen Verweis
* auf den Nachfolger. <br>
*
* Die Klasse ist wegen der Speicherbarkeit der Oberklasse serialisiert.<br>
* '''Die Klasse ist nicht Bestandteil des Zentralabiturs 2009, aber notwendig!!!'''
*
* @author <a href="mailto:schule@dinro.de">DiNaro</a>
* @version 1.0z+ 2006-09-11
*/
public class ListElement implements Serializable
{
/**
* Attribut dient zur Serialisierung.
*/
private static final long serialVersionUID = 8626283657638014888L;
 
/**
* Attribut Date des Listenelements.
*/
private Object item;
 
/**
* Attribut Nachfolger des Listenelements.
*/
private ListElement next;
 
/**
* Attribut Vorgänger des Listenelements.
*/
private ListElement previous;
 
/**
* Der Konstruktor erzeugt ein Listenelement mit Date, Vorgänger und Nachfolger.
*
* @param item Date des Listenelements.
* @param previous Vorgänger des Listenelements
* @param next Nachfolger des Listenelemente.
*/
public ListElement(Object item, ListElement previous, ListElement next)
{ this.item = item;
this.previous = previous;
this.next = next;
}
 
/**
* Gibt die Date des Elements zurück.
* @return  Date des Listenelements.
*/
public Object getItem()
{ return this.item;
}
 
/**
* Gibt den Nachfolger des Listenelements zurück.
* @return    Nachfolger des Listenelements.
*/
public ListElement getNext()
{ return this.next;
}
 
/**
* Gibt den Vorgänger des Listenelements zurück.
* @return  Vorgänger des Listenelements.
*/
public ListElement getPrevious()
{ return this.previous;
}
 
/**
* Setzt die Date des Listenelements.
* @param item    neue Date des Listenelements.
*/
public void setItem(Object item)
{ this.item = item;
}
 
/**
* Setzt den Nachfolger des Listenelements.
* @param next    neuer Nachfolger des Listenelements.
*/
public void setNext(ListElement next)
{ this.next = next;
}
 
/**
* Setzt den Vorgänger des Listenelements.
* @param previous  neuer Vorgänger des Listenelements.
*/
public void setPrevious(ListElement previous)
{ this.previous = previous;
}
 
}
</source>
 
==Probleme mit der Implementierung==
* [http://www.u-helmich.de/inf/BlueJ/kurs121/seite15/abi-list.html Hier] sind offene Fragen und Kommentare zusammengefasst.
* [http://informatik.zum.de/pieper/blog/index.php?entry=entry060828-105313 Aufruf zur Diskussion]
 
==Anwendungsbeispiele==
* [http://informatik.zum.de/pieper/blog/index.php?entry=entry060828-183201 Quiz mit Hilfe einer Liste] + Arbeitsblatt
* [[Liste mit Zahlen (Informatik)]]
 
==Unterseiten zu List==
{{blau|
<subpages
  parent=Java/List
  order=DESC
  order=lastedit
  showpath=no
/>
}}
 
== Siehe auch ==
* [[Informatik]]
* [[Programmiersprachen]]
* [[Abitur (NRW)]]
 
[[Kategorie:Java]]
[[Kategorie:Linksammlung]]

Version vom 14. Mai 2018, 10:00 Uhr

Erster Implementierungsansatz

  • ??? Wahrscheinlich ist der Positionszähler nicht so gemeint. Er soll anscheinend selbst ein Listenelement sein. Besitzt jemand einen stimmigen Quelltext?

Mögliche Interpretation

Realisiert mit ArrayList:

import java.util.ArrayList;

public class List {
private ArrayList liste;
private int positionszeiger;

public List(){
   liste = new ArrayList(); // die Liste ist leer
   positionszeiger=-1; // der Positionszeiger steht vor der Liste
}

public void insertBefore (Object pObject){   
   liste.add(positionszeiger, pObject);
   positionszeiger--;
}

public void insertBehind (Object pObject){   
   liste.add(positionszeiger+1, pObject);
}

public void update (Object pObject){   
   liste.set(positionszeiger, pObject);
}

public void delete (){   
   liste.remove(positionszeiger);
}

public void next(){
   if (positionszeiger!=liste.size()) positionszeiger++;
}

public void previous(){
   if (positionszeiger>-1) positionszeiger--;
}

public void toFirst(){
   positionszeiger=0;
}

public void toLast(){
   positionszeiger=liste.size()-1;
}

public Object getItem(){
   if (liste.size()==0 || positionszeiger==-1 || positionszeiger>=liste.size())
     return null;
   else return liste.get(positionszeiger);
}

public boolean isEmpty (){   
   return (liste.size()==0);
}

public boolean isBefore (){   
   return (positionszeiger<0);
}

public boolean isBehind (){   
   return (positionszeiger>=liste.size());
}

}
Korrekturen

11.09. - insertBehind: Positionszeiger wird vor und zurück gestellt http://informatik.zum.de/pieper/blog/index.php?entry=entry060828-105313

Zweiter Implementierungsansatz OOP pur

  • ??? Wahrscheinlich ist der Positionszeiger aus Delphi entlehnt und nicht sauber auf Java übertragbar. Hier mein Versuch es mit möglichst reinem OOP zu versuchen (bitte auf die Basisklasse ListElement achten).
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

/**
 * '''Bestandteil des Zentralabiturs 2009'''<br>
 * <br>
 * Objekte der Klasse List verwalten beliebige Objekte nach einem Listenprinzip. Ein
 * interner Positionszeiger wird durch die Listenstruktur bewegt, seine Position markiert
 * ein aktuelles Objekt. Die Lage des Positionszeigers kann abgefragt, verändert und die
 * Objektinhalte an den Positionen können gelesen oder verändert werden. Die Klasse Stack
 * stellt Methoden in folgender Syntax zur Verfügung:
 * <ul>
 * <li>public List()</li>
 * <li>public boolean isEmpty()</li>
 * <li>public boolean isBefore()</li>
 * <li>public boolean isBehind()</li>
 * <li>public void next()</li>
 * <li>public void previous()</li>
 * <li>public void toFirst()</li>
 * <li>public void toLast()</li>
 * <li>public Object getItem()</li>
 * <li>public void update (Object pObject)</li>
 * <li>public void insertBefore (Object pObject)</li>
 * <li>public void insertBehind (Object pObject)</li>
 * <li>public void delete()</li>
 * </ul>
 * ''' Nicht Bestandteil des Zentralabiturs 2009''' - dient der praktischen Anwendung<br>
 * <ul>
 * <li>public clone()</li>
 * <li>public load(String fileName)</li>
 * <li>public save(String fileName)</li>
 * </ul>
 *
 * @author <a href="mailto:schule@dinro.de">DiNaro</a>
 * @version 1.0z+ 2006-09-12
 */
public class List implements Cloneable, Serializable
{
	/**
	 * Attribut dient zur Serialisierung.
	 */
	private static final long serialVersionUID = 1087406856309777647L;
	/**
	 * Attribut der Positionszeiger befindet sich vor der Liste (Flag).
	 */
	private boolean before;

	/**
	 * Attribut der Positionszeiger befindet sich hinter der Liste (Flag).
	 */
	private boolean behind;

	/**
	 * Attribut aktuelles Element.
	 */
	private ListElement current;

	/**
	 * Attribut erstes Element der Liste
	 */
	private ListElement first;

	/**
	 * Attribut letztes Element der Liste.
	 */
	private ListElement last;

	/**
	 * Der Konstruktor erzeugt eine leere lineare Liste.<br>
	 * <br>
	 *
	 * <pre>
	 * Konstruktor   List()
	 * <br>
	 * Nachher       Eine leere Liste ist angelegt.
	 *               Der interne Positionszeiger steht vor der leeren Liste.
	 * </pre>
	 */
	public List()
	{
		this.first = null;
		this.last = null;
		this.current = null;
		this.before = true;
		this.behind = false;
	}

	/**
	 * Kopiert die Liste - '''Nicht Bestandteil des Zentralbiturs 2009!!!'''<br>
	 * ("shallow copy" nach dem Handbuch der Java Programmierung Kapitel 9.4.2).
	 *
	 * @return kopierte lineare Liste
	 * @throws CloneNotSupportedException kann nicht auftreten, aber der Compiler will es
	 *           so...
	 */
	@Override
	public List clone() throws CloneNotSupportedException
	{
		try
		{
			return (List) super.clone();// "shallow copy"
		}
		catch (CloneNotSupportedException e)
		{ // Kann nicht auftreten, aber der Compiler will es so...
			throw new CloneNotSupportedException(e.toString());
		}
	}

	/**
	 * Löscht des aktuellen Listenelement.<br>
	 * <br>
	 *
	 * <pre>
	 * Auftrag      delete()
	 * Vorher       Der Positionszeiger steht nicht vor oder hinter der Liste.
	 * Nachher      Das aktuelle Listenelement ist gelöscht. Der Positionszeiger steht auf
	 *              dem Element hinter dem gelöschten Element, bzw. hinter der Liste,
	 *              wenn das gelöschte Element das letzte Listenelement war.
	 * </pre>
	 */
	public void delete()
	{
		if (!this.before && !this.behind)
		{ // Zeiger des Vorgängerelementes setzen
			if (this.current == this.first)
			{ // Vorgänger existiert nicht - Kopfzeiger korregieren
				this.first = this.current.getNext();
			}
			else
			{ // Vorgänger existiert
				this.current.getPrevious().setNext(this.current.getNext());
			}
			// Zeiger des Nachfolgerelementes setzen
			if (this.current == this.last)
			{ // Nachfolger existiert nicht - Scxhwanzzeiger korreegieren
				this.last = this.current.getPrevious();
			}
			else
			{ // Nachfolger existiert
				this.current.getNext().setPrevious(this.current.getPrevious());
			}
			// aktuelles Element setzen
			this.current = this.current.getNext();
			// Flag für Positionszeiger befindet sich hinter der Liste setzen
			this.behind = this.current == null;
		}
	}

	/**
	 * Gibt den Inhalt des aktuellen Listenelementes zurück, ohne die Liste zu verändern.<br>
	 * <br>
	 *
	 * <pre>
	 * Anfrage       getItem(): Object
	 * Nachher       Die Anfrage liefert den Wert des aktuellen Listenelements bzw. null,
	 *               wenn die Liste keine Elemente enthält, bzw. der Positionszeiger
	 *               vor oder hinter der Liste steht.
	 * </pre>
	 *
	 * @return item Inhalt des aktuellen Listenelementes.
	 */
	public Object getItem()
	{
		if (this.current != null)
		{
			return this.current.getItem();
		}
		else
		{
			return null;
		}
	}

	/**
	 * Einfügen eines Listenelementes vor das aktuelle.<br>
	 * <br>
	 *
	 * <pre>
	 * Auftrag       insertBefore (Object pObject)
	 * Vorher        Der Positionszeiger steht nicht vor der Liste.
	 * Nachher       Ein neues Listenelement mit dem entsprechenden Objekt ist angelegt und
	 *               vor der aktuellen Position in die Liste eingefügt worden.
	 *               Der Positionszeiger steht hinter dem eingefügten Element.
	 * </pre>
	 *
	 * @param pObject Inhalt des Listenelementes.
	 */
	public void insertBefore(Object pObject)
	{
		if (!this.before)
		{ // Der Positionszeiger steht nicht vor der Liste.
			ListElement newElement;
			if (this.isEmpty())
			{ // Erstes und einziges Element in die Liste einfügen
				newElement = new ListElement(pObject, null, null);
				this.first = newElement;
				this.last = newElement;
				this.behind = true;
				this.current = null;
			}
			else
			{ // Die Liste ist nicht leer
				if (this.behind)
				{ // Der Positionszeiger steht hinter der Liste
					newElement = new ListElement(pObject, this.last, null);
					this.last.setNext(newElement);
					this.last = newElement;
					this.behind = true;
					this.current = null;
				}
				else
				{	// Der Positionszeiger steht mitten in der Liste
					newElement = new ListElement(pObject, this.current.getPrevious(), this.current);
					if (this.current == this.first)
					{ // Vorgänger existiert nicht - Kopfzeiger korregieren
						this.first = newElement;
					}
					else
					{ // Vorgänger koregieren
						this.current.getPrevious().setNext(newElement);
					}
					// Nachfolger korregieren
					this.current.setPrevious(newElement);
					// Aktuelles Element bleibt aktuelles Element
				}
			}
		}
	}

	/**
	 * Einfügen eines Listenlementes hinter das aktuelle.<br>
	 * <br>
	 *
	 * <pre>
	 * Auftrag       insertBehind (Object pObject)
	 * Vorher        Der Positionszeiger steht nicht hinter der Liste.
	 * Nachher       Ein neues Listenelement mit dem entsprechenden Objekt ist angelegt
	 *               und hinter der aktuellen Position in die Liste eingefügt worden. Der
	 *               Positionszeiger steht vor dem eingefügten Element.
	 * </pre>
	 *
	 * @param pObject Inhalt des Listenelementes.
	 */
	public void insertBehind(Object pObject)
	{
		if (!this.behind)
		{ // Der Positionszeiger steht nicht hinter der Liste.
			ListElement newElement;
			if (this.isEmpty())
			{// Erstes und einziges Element in die Liste einfügen
				newElement = new ListElement(pObject, null, null);
				this.first = newElement;
				this.last = newElement;
				this.before = true;
				this.current = null;
			}
			else
			{ // Die Liste ist nicht leer
				if (this.before)
				{	// Der Positionszeiger steht vor der Liste.
					newElement = new ListElement(pObject, null, this.first);
					this.first.setPrevious(newElement);
					this.first = newElement;
					this.before = true;
					this.current = null;
				}
				else
				{	// Der Positionszeiger steht mitten in der Liste.
					newElement = new ListElement(pObject, this.current, this.current.getNext());
					if (this.current == this.last)
					{ // Nachfolger existiert nicht - Schwanzzeiger korregieren
						this.last = newElement;
					}
					else
					{ // Nachfolger korregieren
						this.current.getNext().setPrevious(newElement);
					}
					// Vorgänger koregieren
					this.current.setNext(newElement);
					// Aktuelles Element bleibt aktuelles Element
				}
			}
		}
	}

	/**
	 * Steht der Positionszeiger vor der Liste?<br>
	 * <br>
	 *
	 * <pre>
	 * Anfrage       isBefore(): boolean
	 * Nachher       Die Anfrage liefert den Wert true, wenn der Positionszeiger vor dem
	 *               ersten Listenelement oder vor der leeren Liste steht, sonst liefert
	 *               sie den Wert false.
	 * </pre>
	 *
	 * @return liefert den Wert true, wenn der Positionszeiger vor dem ersten Listenelement
	 *         oder vor der leeren Liste steht, sonst liefert sie den Wert false.
	 */
	public boolean isBefore()
	{
		return this.before;
	}

	/**
	 * Steht der Positionszeiger hinter der Liste?<br>
	 * <br>
	 *
	 * <pre>
	 * Anfrage       isBehind(): boolean
	 * Nachher       Die Anfrage liefert den Wert true, wenn der Positionszeiger hinter dem
	 *               letzten Listenelement oder hinter der leeren Liste steht, sonst liefert
	 *               sie den Wert false.
	 * </pre>
	 *
	 * @return liefert den Wert true, wenn der Positionszeiger hinter dem letzten
	 *         Listenelement oder hinter der leeren Liste steht, sonst liefert sie den Wert
	 *         false.
	 */
	public boolean isBehind()
	{
		return this.behind;
	}

	/**
	 * Enthält die Liste keine Elemente?<br>
	 * <br>
	 *
	 * <pre>
	 * Anfrage       isEmpty(): boolean
	 * Nachher       Die Anfrage liefert den Wert true, wenn die Liste keine Elemente
	 *               enthält, sonst liefert sie den Wert false.
	 * </pre>
	 *
	 * @return liefert den Wert true, wenn die Liste keine Elemente enthält, sonst liefert
	 *         sie den Wert false.
	 */
	public boolean isEmpty()
	{
		return this.first == null;
	}

	/**
	 * Lädt die gesamte Liste als Objekt aus einer Datei - <b>Nicht Bestandteil des
	 * Zentralbiturs 2009!!!</b><br>
	 * Neues aktuelles Element wird das erste Listenelement(Setzung!).
	 *
	 * @param fileName [Laufwerk][Pfad]Dateiname,
	 * @throws ClassNotFoundException Erwartete Klasse nicht vorhanden
	 * @throws IOException Fehler beim Laden der Datei
	 */
	public void load(final String fileName) throws ClassNotFoundException, IOException
	{
		try
		{
			final ObjectInputStream stream = new ObjectInputStream(
					new FileInputStream(fileName));
			final List dummy = (List) stream.readObject();
			this.first = dummy.first;
			this.last = dummy.last;
			this.before = dummy.before;
			this.behind = dummy.behind;
			this.toFirst(); // Als neues aktuelles Element wird das erste Listenelement gesetzt!
			stream.close();
		}
		catch (final ClassNotFoundException e)
		{ // Erwartete Klasse nicht vorhanden.
			throw new ClassNotFoundException(e.toString());
		}
		catch (final IOException e)
		{ // Fehler beim Laden der Datei.
			throw new IOException(e.toString());
		}
	}

	/**
	 * Setze das aktuelle Listenelement auf das nächste. <br>
	 * <br>
	 *
	 * <pre>
	 * Auftrag       next()
	 * Nachher       Der Positionszeiger ist um eine Position in Richtung Listenende weiter-
	 *               gerückt, d.h. wenn er vor der Liste stand, wird das Element am
	 *               Listenanfang zum aktuellen Element, ansonsten das jeweils nachfolgende
	 *               Listenelement. Stand der Positionszeiger auf dem letzten Listenelement,
	 *               befindet er sich jetzt hinter der Liste. Befand er sich hinter der
	 *               Liste, hat er sich nicht verändert.
	 * </pre>
	 */
	public void next()
	{
		if (!this.isEmpty())
		{
			if (this.before)
			{ // Der Positionszeiger steht vor der Liste; das erste Element wird aktuelles
				this.current = this.first;
				this.before = false;
			}
			else
			{ // der Positionszeiger steht nicht vor der Liste
				if (this.current != null)
				{ // das jeweils nachfolgende Listenelement wird aktuelles
					this.current = this.current.getNext();
					if (this.current == null)
					{ // Der Positionszeiger zeigt hinter das letzte Element
						this.behind = true;
					}
				}
			}	// Der Positionszeiger befindet sich hinter der Liste und bleibt unverändert
		}
	}

	/**
	 * Setze das aktuelle Listenelement auf das vorherige.<br>
	 * <br>
	 *
	 * <pre>
	 * Auftrag       previous()
	 * Nachher       Der Positionszeiger ist um eine Position in Richtung Listenanfang
	 *               weitergerückt, d.h. wenn er hinter der Liste stand, wird das Element am
	 *               Listenende zum aktuellen Element, ansonsten das jeweils vorhergehende
	 *               Listenelement. Stand der Positionszeiger auf dem ersten Listenelement,
	 *               befindet er sich jetzt vor der Liste. Befand er sich vor der Liste, hat
	 *               er sich nicht verändert.
	 * </pre>
	 */
	public void previous()
	{
		if (!this.isEmpty())
		{	/// Der Positionszeiger bleibt unverändert, wenn die Liste leer ist
			if (this.behind)
			{ // Der Positionszeiger steht hinter der Liste; das letzte Element wird aktuelles
				this.current = this.last;
				this.behind = false;
			}
			else
			{// Der Positionszeiger steht nicht hinter der Liste
				if (this.current != null)
				{ // das jeweils vorhergehende Listenelement wird aktuelles
					this.current = this.current.getPrevious();
					if (this.current == null)
					{ // Der Positionszeiger zeigt vor das erste Element
						this.before = true;
					}
				}
			}	// Der Positionszeiger befindet sich vor der Liste und bleibt unverändert
		}
	}

	/**
	 * Speichert die gesamte Liste als Objekt in einer Datei - <b>Nicht Bestandteil des
	 * Zentralbiturs 2009!!!</b><br>
	 * Das aktuelles Element bleibt erhalten!
	 *
	 * @param fileName [Laufwerk][Pfad]Dateiname.
	 * @throws IOException Fehler beim Speichern der Datei
	 */
	public void save(String fileName) throws IOException
	{
		try
		{
			ObjectOutputStream stream = new ObjectOutputStream(new FileOutputStream(fileName));
			stream.writeObject(this);
			stream.close();
		}
		catch (IOException e)
		{ // Fehler beim Speichern der Datei.
			throw new IOException(e.toString());
		}
	}

	/**
	 * Setzt das aktuelle Listenelement auf das erste zurück.<br>
	 * <br>
	 *
	 * <pre>
	 * Auftrag       toFirst()
	 * Nachher       Der Positionszeiger steht auf dem ersten Listenelement.
	 *               Falls die Liste leer ist befindet er sich jetzt hinter der Liste.
	 * </pre>
	 */
	public void toFirst()
	{
		this.current = this.first;
		this.before = false;
		this.behind = this.isEmpty();
	}

	/**
	 * Setzt das aktuelle Listenelement auf das letzte zurück.<br>
	 * <br>
	 *
	 * <pre>
	 * Auftrag       toLast()
	 * Nachher       Der Positionszeiger steht auf dem letzten Listenelement.
	 *               Falls die Liste leer ist befindet er sich jetzt vor der Liste.
	 * </pre>
	 */
	public void toLast()
	{
		this.current = this.last;
		this.behind = false;
		this.before = this.isEmpty();
	}

	/**
	 * <pre>
	 * Auftrag       update (Object pObject)
	 * Vorher        Die Liste ist nicht leer. Der Positionszeiger steht nicht vor oder
	 *               hinter der Liste.
	 * Nachher       Der Wert des Listenelements an der aktuellen Position ist durch pObject
	 *               ersetzt.
	 * </pre>
	 *
	 * @param pObject neuer Wert des Listenelements
	 */
	public void update(Object pObject)
	{ // Die Liste ist nicht leer. Der Positionszeiger steht nicht vor oder hinter der
		// Liste.
		if (!this.isEmpty() && !this.before && !this.behind)
		{	// Die Liste ist nicht leer. Der Positionszeiger steht nicht vor oder hinter der Liste.
			this.current.setItem(pObject);
		}
	}

}
////////////////////////////////// Basisklasse ListElement /////////////////////////////////
import java.io.Serializable;

/**
 * Datei ListElement.java (Klasse Listelement mit generalisiertem Datentyp Object).<br>
 * <br>
 * Die Klasse ListElement ist die '''Basisklasse für doppelt verkette Listen'''.<br>
 * <br>
 * Ein ListElement enthält eine Date, einen Verweis auf den Vorgänger und einen Verweis
 * auf den Nachfolger. <br>
 *
 * Die Klasse ist wegen der Speicherbarkeit der Oberklasse serialisiert.<br>
 * '''Die Klasse ist nicht Bestandteil des Zentralabiturs 2009, aber notwendig!!!'''
 *
 * @author <a href="mailto:schule@dinro.de">DiNaro</a>
 * @version 1.0z+ 2006-09-11
 */
public class ListElement implements Serializable
{
	/**
	 * Attribut dient zur Serialisierung.
	 */
	private static final long serialVersionUID = 8626283657638014888L;

	/**
	 * Attribut Date des Listenelements.
	 */
	private Object item;

	/**
	 * Attribut Nachfolger des Listenelements.
	 */
	private ListElement next;

	/**
	 * Attribut Vorgänger des Listenelements.
	 */
	private ListElement previous;

	/**
	 * Der Konstruktor erzeugt ein Listenelement mit Date, Vorgänger und Nachfolger.
	 *
	 * @param item Date des Listenelements.
	 * @param previous Vorgänger des Listenelements
	 * @param next Nachfolger des Listenelemente.
	 */
	public ListElement(Object item, ListElement previous, ListElement next)
	{	this.item = item;
		this.previous = previous;
		this.next = next;
	}

	/**
	 * Gibt die Date des Elements zurück.
	 * @return  Date des Listenelements.
	 */
	public Object getItem()
	{	return this.item;
	}

	/**
	 * Gibt den Nachfolger des Listenelements zurück.
	 * @return    Nachfolger des Listenelements.
	 */
	public ListElement getNext()
	{	return this.next;
	}

	/**
	 * Gibt den Vorgänger des Listenelements zurück.
	 * @return  Vorgänger des Listenelements.
	 */
	public ListElement getPrevious()
	{	return this.previous;
	}

	/**
	 * Setzt die Date des Listenelements.
	 * @param item    neue Date des Listenelements.
	 */
	public void setItem(Object item)
	{	this.item = item;
	}

	/**
	 * Setzt den Nachfolger des Listenelements.
	 * @param next    neuer Nachfolger des Listenelements.
	 */
	public void setNext(ListElement next)
	{	this.next = next;
	}

	/**
	 * Setzt den Vorgänger des Listenelements.
	 * @param previous  neuer Vorgänger des Listenelements.
	 */
	public void setPrevious(ListElement previous)
	{	this.previous = previous;
	}

}

Probleme mit der Implementierung

Anwendungsbeispiele

Unterseiten zu List

{{{1}}}


Siehe auch