Klassen und Objekte - Typen und Werte Lineare Listen

Werbung
SWE-60
Klassen und Objekte - Typen und Werte
• In Java sind Grundtypen mit ihren Werten und Operationen darauf
nicht als Klassen mit Objekten und Methoden darauf definiert!
• Da z. B. Datenstrukturen wie Hashtable nur Objekte speichern, gibt es zu den Grundtypen
int, long, float, double, boolean, char
Klassen, die Werte in Objekten kapseln und Methoden dafür definieren (envelope classes):
Integer, Long, Float, Double, Boolean, Character (wrapper classes)
• Konversion z. B. zwischen int und Integer:
Integer-Konstruktor erzeugt Objekt aus Wert
Objekt-Methode von Integer liefert Wert
Integer (int value);
int intValue ();
• Konversion z. B. zwischen Integer und String:
Integer-Konstruktor erzeugt Objekt aus Ziffernfolge
Objekt-Methode von Integer liefert Wert als String
Integer (String s);
String toString ();
© 1999 bei Prof. Dr. Uwe Kastens
• Beispiele:
int i = 12;
Integer iObj = new Integer (i); // int-Wert in Objekt verpacken
int j = iObj.intValue();
// verpackten Wert holen
String s = iObj.toString();
// aus iObj ein String-Objekt erzeugen
String t = iObj;
// dasselbe implizit
Integer kObj = new Integer ("137"); // Integer-Objekt aus Ziffernfolge
SWE-68
Lineare Listen
Lineare Listen repräsentieren Folgen gleichartiger* Elemente als
dynamisch veränderliche Datenstruktur mit linearem Zugriff:
1
2
3
4
5
Listen werden aus Paaren aufgebaut: (Elementwert, Referenz auf den Rest der Liste)
1
Einfügen eines Elementes:
2
3
4
5
7
© 1999 bei Prof. Dr. Uwe Kastens
Löschen eines Elementes:
(*) Implementierung in Java:
nicht notwendig gleichartige Elemente, Elemente sind Objektreferenzen der Klasse Object
SWE-69
Implementierung linearer Listen
• Klasse Node für Paare (Element, Rest der Liste):
ein Objekt dazu:
class Node
{ Node (Object d, Node n)
{data = d; link = n;}
Object data; Node link;
5
}
• Objektvariable sind von aussen zugänglich (für die ADT-Klasse List, siehe SWE-71)
• Die vordefinierte Klasse Object umfasst Objektreferenzen beliebiger Klassen
• Deklaration einer Listenvariable, initialisiert mit einer 1-elementigen Liste:
© 1999 bei Prof. Dr. Uwe Kastens
Node list = new Node (new Integer (5), null);
• Element muß ein Objekt sein, also „Wrapper“ (envelope) für Werte von Grundtypen
• null: vordefinierter Name für die einzige Referenz, die kein Objekt identifiziert
SWE-70
Elementare Operationen mit linearen Listen
• Aufbauen einer Liste in umgekehrter Reihenfolge:
Node list = null;
for (int i = n; i > 0; i--)
list = new Node (new Integer (i), list);
• Einen Elementwert zahl in der Liste suchen:
Integer zahlObj = new Integer (zahl);
Node l = list;
while (l != null)
{ if (l.data.equals (zahlObj)) break;
l = l.link;
}
String s = ((l == null) ? s = " not" : "");
System.out.println (zahl + s + " found");
// s.u. (*)
// bedingter Ausdruck
• Ein Element d nach dem Paar l einfügen (l sei != null):
l.link = new Node (d, l.link);
© 1999 bei Prof. Dr. Uwe Kastens
• Ein Paar l mit Vorgänger prev löschen (l, prev seien != null):
prev.link = l.link;
Bei allen Operationen die Sonderfälle am Anfang und Ende der Liste beachten!
(*) equals ist für die Klasse Object definiert und wird von den Wrapper-Klassen als
Wertvergleich spezialisiert.
SWE-71
Abstrakter Datentyp Liste
ADT- Operationen für Listen mit verschieblicher Position zum Lesen, Einfügen und Löschen:
start
prev
now
aktuelle Position:
class List
{ List();
public void insert (Object x)
{
// Konstruktor
// Element x hinter akt. Pos. einfügen
Node newElem = new Node (x, null);
// und neues Element wird aktuelle Position
if (start == null)
// Liste ist leer
{ start = newElem; now = newElem;}
else
if (now == null) // Position ist außerhalb der Liste, am Anfang einfügen
{ newElem.link = start; start = newElem; now = newElem; prev = null;}
else
{ newElem.link = now.link; now.link = newElem; prev = now; now = newElem;}
© 1999 bei Prof. Dr. Uwe Kastens
}
public void remove () {…}
public Object current () {…}
public void succ() {…}
public void reset () {…}
public boolean isEol () {…}
public boolean isEmpty () {…}
private Node start, prev, now;
// Element löschen
// Wert des Elementes
// Position weitersetzen
// Position an den Anfang
// ist die Position außerhalb der Liste?
// ist die Liste leer?
// die 3 lokalen Variablen
}
SWE-72
Anwendung des ADT List: Nelsons Kaffeeladen
Das Array für die Lieferungen zu jeder Kaffeesorte wird durch ein List-Objekt ersetzt:
import List;
class Coffee
{
boolean newBatchIn (BufferedReader in) throws IOException
{ ...
BatchStock.insert (batch);
// gelesene Lieferung einfügen
}
© 1999 bei Prof. Dr. Uwe Kastens
double sell (Double toSell)
// eine Menge Kaffee verkaufen
{ ...
// die Liste der Lieferungen durchlaufen:
for (BatchStock.reset(); !BatchStock.isEol(); BatchStock.succ())
{ Batch b = (Batch)BatchStock.current();
// ... gewünschte Menge aus den Lieferungen entnehmen
}
return toSell;
}
...
private List BatchStock = new List ();
}
Ebenso in der Klasse CoffeeShop ein List-Objekt mit den Kaffeesorten einführen.
SWE-41
Rekursive Datenstrukturen mit rekursiven Methoden
© 1999 bei Prof. Dr. Uwe Kastens
Ein binärer Baum ist leer oder er besteht aus einem Wert und zwei Unterbäumen:
class BinTree
// Binäre Bäume mit Zeichenwerten an den Baumknoten
{ BinTree (BinTree l, char v, BinTree r)
// Konstruktor für innere Knoten
{ left = l; value = v; right = r; }
BinTree (char v)
// Konstruktor für Blattknoten
{ left = null; value = v; right = null; }
void inFix ()
// Ausgabe in Infix-Form, geklammert
{ System.out.print (’(’);
if (left != null) left.inFix ();
System.out.print (value);
if (right != null) right.inFix ();
System.out.print (’)’);
}
void postFix ()
// Ausgabe in Postfix-Form
{ if (left != null) left.postFix ();
if (right != null) right.postFix ();
System.out.print (value);
}
private BinTree left, right; private char value;
}
Aufruf z.B.: (new BinTree(new BinTree(’A’),’/’,new BinTree(’B’))).inFix();
Herunterladen