Folge 11 - Eine Vokabelliste

Teil 1

Schritt 1

Wir wollen nun ein BlueJ-Programm schreiben, das Ihnen beim Vokabellernen helfen soll. Zunächst einmal benötigen wir eine Klasse Vokabel, deren Objekte dann in einer ArrayList gespeichert werden. Die Abbildung 1 zeigt eine solche Klasse, allerdings in einer Minimalversion, die außer dem Konstruktor und einer Methode zum Anzeigen der Vokabel nichts enthält.

1 Die Klasse Vokabel ist schnell progammiert. Lassen Sie den Mauszeiger einige Sekunden über dem Quelltext stehen, dann erhalten Sie weitere Informationen.

Achten Sie bitte darauf, dass die beiden Attribute deutsch und englisch als private deklariert wurden! Es ist daher nicht möglich, direkt auf den Inhalt der Attribute zuzugreifen. Wollen Sie den Wert der Attribute auslesen oder verändern, so müssen Sie dazu spezielle sondierende Methoden für die Klasse Vokabel schreiben, z.B. public String gibDeutsch().

Klasse ArrayList






Für die neu hinzugekommenen Schüler(innen):

In der Folge 9 des 11er Kurses haben wir uns mit Arraylisten beschäftigt. Wenn Sie mehr über Arraylisten lesen wollen, sollten Sie sich die Folge 9 im Schnelldurchgang anschauen.

Schritt 2

Wir erzeugen jetzt eine Klasse VokabelListe, deren Minimalversion so aussehen kann wie in Abb. 2 gezeigt.

2 Das Grundgerüst der Klasse Vokabelliste

Es wird hier noch gar nichts Vokabelspezifisches gemacht. Der Konstruktor legt lediglich eine leere Arrayliste an, die theoretisch alles Mögliche speichern könnte.

Noch besteht also überhaupt keine Beziehung zwischen den Klassen Vokabel und VokabelListe. Als nächstes wollen wir der Klasse VokabelListe mitteilen, dass sie Objekte der Klasse Vokabel speichern soll, und zwar in dem Attribut liste.

Schritt 3 / Übung 11.1 (2 + 1 Punkte)

Erweitern Sie die Klasse VokabelListe um folgende Methoden:
public void hinzufuegen(String deutsch, String englisch);
public void hinzufuegen(Vokabel neu);

Sie haben richtig gelesen, Sie sollen zwei hinzufuegen()-Methoden programmieren, eine mit zwei String-Parametern und eine mit einem Vokabel-Parameter. Sollten Sie sich mit dem Overloading von Methoden nicht auskennen, lesen Sie bitte die Theorieseite dazu.

Hinweise:

Sie müssen selbst schon herausfinden, wie man Objekte zu einer ArrayList hinzufügt. Da die Parameter deutsch und englisch keine Objekte sind, müssen Sie bei dieser Variante der Methode hinzufuegen() zu einem Trick greifen: Innerhalb von hinzufuegen() erzeugen Sie ein neues leeres Objekt der Klasse Vokabel. Dem Konstruktor von Vokabel übergeben Sie die beiden String-Parameter - und schon haben Sie ein Objekt, das sie der ArrayList hinzufügen können.



Overloading

Für die Seiten

benötigen Sie einen Benutzernamen und ein Passwort. Lehrer und Lehrerinnen anderer Schulen können sich die Zugangsdaten holen, indem Sie mir eine EMail schreiben und dort ihre Schuladresse mitteilen, z.B. in der Form:

Herr Ulrich Helmich
Söderblom-Gymnasium
Kantstraße 33
32339 Espelkamp

Ich schicke dann einen Brief mit dem Passwort an die Schuladresse.

Schritt 4 / Übung 11.2 (2 Punkte)

Schreiben Sie eine Methode VokabelListe.anzeigen(), die alle in der Liste gespeicherten Vokabeln anzeigt.

Die vollen zwei Punkte erhalten Sie nur dann, wenn der Quelltext Ihrer Methode nicht unnötig lang ist. Leider kann Ihnen an dieser Stelle noch nicht verraten werden, was unter "unnötig lang" zu verstehen ist, da Ihnen dann bereits ein Teil der Lösung bekannt wäre.



Klausuraufgabe zum Thema ArrayList (November 2005)

Lösungen dazu.

Schritt 5

Wir wollen jetzt eine Funktion zum Suchen einer Übersetzung programmieren. Gegeben ist der deutsche Begriff, gesucht wird die englische Übersetzung.

Prinzipielles Vorgehen

  1. Wir geben den deutschen Begriff als String ein.
  2. Dann werden die Vokabeln der Liste der Reihe nach durchsucht. Wenn der eingegebene String mit dem String-Attribut deutsch einer Vokabel übereinstimmt, dann ist die Suche beendet.
  3. In diesem Fall wird das Attribut englisch der gefundenen Vokabel ausgegeben. Andernfalls wird mit der Suche weitergemacht.
  4. Sind wir mit der Suche am Ende der Arrayliste angekommen und haben die Vokabel nicht gefunden, wird eine entsprechende Meldung angezeigt.

Implementierung

Eingeben des deutschen Begriffs

Hier können wir dank BlueJ sehr einfach verfahren: Wir implementieren den deutschen Begriff als Parameter der Suchfunktion:

public void sucheEnglisch(String suchwort);
Suchen des englischen Begriffs

Wir müssen vorne in der Arrayliste mit der Suche anfangen und im ungünstigsten Fall bis zum Ende der Liste weitersuchen. Hier würde sich eine while-Schleife anbieten, die wir verlassen können, wenn das Suchwort gefunden wurde.

int i = 0;
boolean gefunden = false;

while (!gefunden)
{
   Vokabel vok = (Vokabel) liste.get(i);
   if (vok.deutsch == suchwort)
   {
      gefunden = true;
      System.out.println
          ("Übersetzung: "+ vok.englisch);
   }
   else i++;
}

Was Sie hier sehen, ist der 08/15-Versuch einer Implementierung des Suchens. Leider enthält diese Version noch mindestens drei teils gravierende Fehler. Aber zumindest haben Sie jetzt eine Vorstellung davon, wie man die Suche implementieren könnte. Da die folgende Übung nicht ganz einfach ist, wird die erfolgreiche Lösung auch mit sage und schreibe 8 Punkten honoriert!

Übung 11.3 (8 Punkte)

a) Finden und dokumentieren Sie alle Fehler in dem obigen Quelltext.
b) Implementieren Sie eine fehlerfreie und funktionstüchtige Suchfunktion! Beachten Sie dabei streng das Prinzip der Datenkapselung! Außerdem sollten Sie sich noch mal alle wichtigen Methoden der Klasse ArrayList anschauen. Vielleicht finden Sie ja etwas Brauchbares.

Ferner sollten Sie sich im Internet (am besten auf den Sun-Seiten) über die Klasse String informieren und vor allem die Frage klären, wie man zwei Strings miteinander vergleichen kann.

3 Die Klasse Tester

In der Abbildung 3 sehen Sie, wie man BlueJ-Projekte in Ruhe testen kann. Schreiben Sie sich einfach eine Klasse Tester, welche nicht anderes macht, als die eigentlichen Klassen zu testen. Im Konstruktor von Tester werden mehrere Vokabeln der Vokabelliste hinzugefügt, dabei werden beide hinzufuegen()-Methoden getestet. Anschließend wird die anzeigen()-Methode getestet. Sie müssten diese Tester-Klasse jetzt um Tests der Suchen-Funktion erweitern.




Dringend empfohlen für Übung 11.3:


Sun-Seiten zum Thema String



Methoden der Klasse ArrayList

Schritt 6

An der anzeigen()-Methode stört etwas sehr stark: Die Vokabeln werden so angezeigt, wie sie eingegeben wurden. Völlig ungeordnet also.

Übung 11.4 (8 Punkte)

Ändern Sie dies, indem Sie zwei Methoden

public void sortierenDeutsch()
public void sortierenEnglisch()

schreiben, welche die ArrayList nach den deutschen bzw. englischen Begriffen aufsteigend (a..z) sortieren.

Sie haben in der Folge 10 die drei primitiven Sortierverfahren kennengelernt.

Das Sortieren von Zahlen in einem Array ist natürlich einfacher als das Sortieren von Vokabeln in einer Arrayliste, darum erhalten Sie ja auch die enorme Zahl von 8 Punkten, wenn Sie es trotzdem schaffen.

Sie müssen sich vorher intensiv mit der Klasse String auseinandersetzen, vor allem mit der Frage, wie kann man zwei Strings vergleichen? Wie bekommt man heraus, welcher String "kleiner" und welcher "größer" ist? Gehen Sie dazu auf die Sun-Webseite über Strings und lesen Sie sich die verschiedenen Methoden, die in Frage kommen, durch.

Außerdem müssen Sie sich noch einmal intensiv mit der Klasse ArrayList auseinandersetzen. Schließlich handelt es sich nicht um einen einfachen Array; das Vertauschen von zwei Elementen einer ArrayList lässt sich implementieren, ist aber nicht ganz trivial!



Hinweis:
Tricks mit einem zusätzlichen Array oder einer weiteren Arrayliste zum Zwischenspeichern sind natürlich nicht erlaubt. Sie müssen die Vokabel-Objekte "am Ort" sortieren, wie es so schön heißt.

und weiter mit Teil 2

Diese HTML-Seite wurde erstellt von Ulrich Helmich am 18. Juni 2005 mit Golive 6.






IMPRESSUM