studyklar
GdI 1 · Übungsblatt 11 · Aufgabe 1

Wörterbuch als Klasse Dictionary mit Testprogramm

Ein Wörterbuch Deutsch → Englisch als eigene Klasse: Man trägt Wortpaare ein und fragt später ein deutsches Wort ab. Teil (a) baut die Klasse Dictionary, Teil (b) ein Testprogramm mit Menü. Rechts steht ein Wörterbuch-Objekt mit seinen Daten und darunter der Code; hervorgehoben ist, was zum aktuellen Schritt gehört.

Die Aufgabe

Übungsblatt 11

Auf die Verwendung der Klassen In und Out soll ab sofort verzichtet werden. Realisieren Sie alle Ein- und Ausgaben mit den Möglichkeiten der Java-Klassenbibliothek.

Aufgabe 11.1

a) Implementieren Sie ein Wörterbuch als Klasse Dictionary. Das Wörterbuch soll Paare von deutschen und entsprechenden englischen Wörtern enthalten. Dabei soll das deutsche Wort als Suchkriterium dienen und das englische als Wert, der dazu gefunden werden soll. Die folgenden Operationen sowie geeignete Konstruktoren sind vorzusehen:

  • void insert (String key, String value)
  • String lookup (String key)
  • void printList ()
  • int showSize ()

Mit Hilfe der Methode insert werden key und value in das Wörterbuch eingetragen.

Mit Hilfe von lookup wird key im Wörterbuch gesucht und das entsprechende value oder null, falls key nicht gefunden wird, zurückgeliefert.

printList gibt das gesamte Wörterbuch auf dem Bildschirm aus.

showSize gibt die aktuelle Anzahl der Einträge aus.

Bei der Realisierung soll darauf geachtet werden, dass auf die internen Daten von außen nicht zugegriffen werden kann. Ein Objekt der Klasse Dictionary soll nur über die Methoden insert, lookup, printList und showSize ansprechbar sein. Mit Hilfe des parameterlosen Konstruktors kann eine feste (im Programm festgelegte) Größe des Wörterbuchs erreicht werden, z. B. 10. Ein weiterer Konstruktor erwartet einen Parameter, der zum Zeitpunkt der Objekt-Generierung die gewünschte Größe des Wörterbuchs angibt.

b) Zum Testen der Klasse Dictionary soll eine weitere Klasse TestDictionary geschrieben werden. Mit Hilfe der main-Methode in der Klasse TestDictionary sollen interaktiv Wörterpaare eingetragen und später einzelne Wörter erfragt werden können. Die main-Methode erwartet wahlweise keinen oder einen Parameter, welcher die Größe des Wörterbuches angibt. Zur Realisierung der Auswahl der jeweils gewünschten Funktion können Sie sich an vorherigen Aufgaben orientieren (A8_2, A9_1).

Gesucht sind zwei Klassen. Dictionary speichert Paare aus einem deutschen Wort (dem Schlüssel, englisch key) und seiner englischen Übersetzung (dem Wert, englisch value). Von außen darf man nur über die vier genannten Methoden an die Daten. Zwei Konstruktoren legen die Größe fest: fest 10 oder frei gewählt. TestDictionary ist das Hauptprogramm: Es legt ein Wörterbuch an und lässt den Benutzer über ein Menü Paare eintragen und Wörter nachschlagen.

Ein Konstruktor ist eine besondere Methode, die beim Anlegen eines Objekts mit new läuft und seine Felder vorbereitet. Ab diesem Blatt gilt außerdem: keine Kursklassen In und Out.

Merke: Eine Klasse bündelt Daten und die Methoden, die mit ihnen arbeiten. Sind die Daten private, kann nur die Klasse selbst sie ändern, und alle anderen müssen ihre Methoden benutzen.
  1. (a) Objekt und Felder: zwei Arrays und ein Zähler.
  2. (a) Die Daten mit private schützen.
  3. (a) Zwei Konstruktoren.
  4. (a) insert: ein Paar eintragen.
  5. (a) lookup: ein Wort suchen.
  6. (a) printList und showSize.
  7. (b) Die Größe aus dem Startparameter.
  8. (b) Menü und Schleife.
  9. (b) Eintragen und nachschlagen.
  10. (b) Ausgeben, Anzahl, falscher Code.
  11. (b) Übersetzen und Testlauf mit Größe 4.
  12. (b) Volles Wörterbuch und ohne Parameter.

Objekt und Felder: zwei Arrays und ein Zähler

public class Dictionary {     private String[] keys;    private String[] values;    private int size = 0;
}

Eine Klasse ist der Bauplan, ein Objekt ist ein nach diesem Plan gebautes Exemplar. Ein Feld ist eine Variable, die in der Klasse steht, aber außerhalb jeder Methode. Jedes new Dictionary(…) legt ein neues Objekt mit eigenen Feldern an: Zwei Wörterbücher teilen sich keine Daten.

Deshalb fehlt bei den Feldern und Methoden von Dictionary das Wort static. Eine Methode ohne static arbeitet mit den Feldern eines bestimmten Objekts und wird über dieses Objekt aufgerufen: dict.insert(…) trägt in das Wörterbuch dict ein.

Aus Blatt 10, Aufgabe 1 („Sortieren mit eigener Klasse Sort: Zahlen aus Datei, auf- oder absteigend“): Dort waren sortUp und sortDown mit static deklariert. Sie gehören zur Klasse selbst und werden ohne Objekt aufgerufen: Sort.sortUp(a). Die Daten, das Array, kamen als Parameter.

Ein Wörterbuch muss viele Paare halten. Dafür bekommt die Klasse zwei Arrays gleicher Länge: keys für die deutschen Wörter, values für die englischen. Was am selben Index steht, gehört zusammen: keys[2] ist „Hund“, values[2] ist „dog“.

Dazu kommt size, die Anzahl der belegten Plätze. Die Arrays werden von vorn gefüllt. Darum ist size zugleich der Index des nächsten freien Platzes. Rechts ein Beispiel: Platz für 4 Paare, 3 davon belegt.

Aus Skript 6, Folie 6-13 („Kombination von Klassen und Arrays“): Eine Tabelle lässt sich als Array von Zeilenobjekten bauen (book[0].name) oder als Objekt mit einem Array je Spalte (book.name[0]). Hier ist es die zweite Form.

Die Daten mit private schützen

Dictionary dict = new Dictionary();dict.size = 5;
Access.java:4: Fehler: size hat private-Zugriff in Dictionary
        dict.size = 5;
            ^

Die Aufgabe verlangt, dass von außen niemand an die internen Daten kommt. Das erledigt das Wort private vor jedem Feld: Nur Code innerhalb der Klasse Dictionary darf keys, values und size lesen oder ändern. Die Methoden dagegen bekommen public, sie sind für alle da.

So kann kein anderes Programm size verstellen und das Wörterbuch durcheinanderbringen. Versucht es das trotzdem, übersetzt der Compiler das Programm nicht. Getestet mit einer kleinen Klasse Access, deren Zeile 4 so lautet wie unten.

Noch 11 Schritte bis zum Ergebnis
Den ganzen Lösungsweg sehen Studierende und Lehrende der HS KL. Registriere dich mit deiner Adresse @stud.hs-kl.de oder @hs-kl.de, dann geht es hier direkt weiter.

Abbildung 1(a) Die Klasse Dictionary

Felder, Konstruktoren, Methoden

Objekt dict der Klasse Dictionary, angelegt mit new Dictionary(4)
private int size = 3Anzahl der Einträge; zugleich der nächste freie Index
Indexprivate String[] keysprivate String[] values
0
"Haus"
"house"
1
"Baum"
"tree"
2
"Hund"
"dog"
3
null
null
keys.length = values.length = 4 Plätze, davon 3 belegt
Legendegerade gemeintEin Beispiel-Objekt: Platz für 4 Paare, 3 davon eingetragen. Die Schritte erklären, wie es so weit kommt.

Abbildung 1(a) Die Klasse Dictionary

Felder, Konstruktoren, Methoden

public class Dictionary {     private String[] keys;    private String[] values;    private int size = 0;     public Dictionary() {        keys = new String[10];        values = new String[10];    }     public Dictionary(int capacity) {        keys = new String[capacity];        values = new String[capacity];    }     public void insert(String key, String value) {        if (size >= keys.length) {            System.out.println("Das Wörterbuch ist voll, " + key + " wurde nicht eingetragen.");        } else {            keys[size] = key;            values[size] = value;            size++;        }    }     public String lookup(String key) {        for (int i = 0; i < size; i++) {            if (key.equals(keys[i])) {                return values[i];            }        }        return null;    }     public void printList() {        for (int i = 0; i < size; i++) {            System.out.println(keys[i] + " -> " + values[i]);        }    }     public int showSize() {        return size;    }}