Skip to Content

Übung: Interfaces und abstrakte Klassen

Stefan Schneider's picture

Übung: Implementiere Interface Sortierbar

Die Klassensammlung zum Sortieren bietet das Interface Sortierbar an mit dessen Hilfe die Klasse Sortierer beliebige Klassen sortieren kann.

Benutzen die Beispielprogramme zum Sortieren.

Übung 1

Benutzen Sie das Hauptprogramm und die Klasse Ganzzahl der Beispielprogramme und Implementieren sie die Klasse SelectionSort indem Sie:

  • Die Klasse aus der abstrakten Klassen Sortierer ableiten
  • Benutzen Sie die ererbten Methoden istKleiner() und tausche() für alle Operationen auf dem zu sortierenden Feld
  • Implementieren Sie die Methode sortieren()
  • Implementieren Sie die Methode algorithmus() und geben Sie den Namen des Algorithmus als Text zurück

Testen Sie den Algorithmus mit dem Hauptprogramm der Beispielprogramme zum Sortieren

  • Im Hauptprogramm wird standardmässig die Klasse TrivialSort zu sortieren aufgerufen. Kommentieren Sie diese Zeile aus und wählen Sie in den folgenden Zeilen den SelectionSort in dem Sie den entsprechenden Zeilenkommentar entfernen.

Übung 2

Benutzen Sie die gegebene Infrastruktur der Beispieleprogramme und den Selectionsort um eine Klasse Person aus der Schnittstelle Sortierbar zu implementieren

  • Die Klasse Person verfügt über 
    • einen Vornamen
    • einen Nachnamen
  • Objekte sollen zuerst nach Nachnamen sortiert werden. Bei gleichem Nachnamen soll nach Vornamen sortiert werden.
  • Sortieren Sie die Personen lexikographisch korrekt. Hierzu dient die Klasse Collator (Hilfestellung)
  • Passen Sie die Klasse Main der Beispielprogramme sinngemäß an um die Implementierung testen zu können.

Hilfestellung (1): Rahmenimplementierung für die Klasse Person

Diese Implementierung ist übersetzbar. Implementieren Sie die Methode compareTo(). In der Rahmenimplementierung wird eine Sicherheitsabfrage zum Typ durchgeführt. Die Abfrage ist sinnvoll, da die Standardschnittstelle compareTo() ein beliebiges Objekt übergegeben kann.

package Kurs2.Sort;
 
import java.text.Collator;
import java.util.Locale;
import java.util.Random;

public class Person implements Sortierbar {

private String nachname;
private String vorname;
private static int maxLaenge = 10; // Maximale Laenge von Zufallszeichenketten
private static Locale myLocale = Locale.GERMANY; // Zu verwendende Sortierordnung
private static final char[] symbolvorrat = new char[52];
private final Random random = new Random();
// Symbolvorrat aus dem Zufallszeichen genommen werden
static {
for (int idx = 0; idx < 10; ++idx) {
symbolvorrat[idx] = (char) ('0' + idx);
}
for (int idx = 10; idx < 36; ++idx) {
symbolvorrat[idx] = (char) ('a' + idx - 10);
}
for (int idx = 36; idx < 52; ++idx) {
symbolvorrat[idx] = (char) ('A' + idx - 36);
}
}
/**
* Konstruktor der Klasse Person
* @param nn Nachname
* @param vn Vorname
*/
public Person(String nn, String vn) {
nachname = nn;
vorname = vn;
}
/**
*
* @param s
* @return -1 wenn der Eingabewert kleiner ist
* 0 wenn der Eingabewert gleich ist
* +1 wenn der Eingabewert größer ist
*/
@Override
public int compareTo(Object s) {
int result = -1;
Person p;
if (s.getClass() == this.getClass()) {
p = (Person) s;
// Hier die Implementierung einfügen
}
return result;
}
/**
* Erlaubt den Vor- und Nachnamen als Text auszudrucken
* @return
*/
public String toString() {
return nachname + ", " + vorname;
}
/**
* Erzeugt zufällige Zeichenketten für Vornamen und Nachnamen
*/
public void generiereZufallswert() {
char[] buf; // Temporärer Puffer zum generieren der Zeichnekette
int length; // Groesse des Puffer
// Erzeugen eines Puffers einer zufälligen Groesse
length = (int) (Math.random() * ((double) maxLaenge - 1)) + 1;
buf = new char[length];
// Erzeugen eines zufaelligen Nachnamens
for (int index = 0; index < buf.length; ++index) {
buf[index] = symbolvorrat[random.nextInt(symbolvorrat.length)];
}
nachname = new String(buf);
// Erzeugen eines zufälligen Vornamens
for (int index = 0; index < buf.length; ++index) {
buf[index] = symbolvorrat[random.nextInt(symbolvorrat.length)];
}
vorname = new String(buf);
}
}

 Hilfestellung (2): Planung der compareTo() Methode

  • Welche beiden Objekte werden miteinander verglichen? (Objektreferenzen!)
  • Wie muss der Collator initialisiert werden? Welche Sortierstärke wollen Sie verwenden?
  • Welche Attribute sollen als erstes verglichen werden?
  • Wann muss man weitere Attribute prüfen?