studyklar
GdI 1 · Übungsblatt 10 · Aufgabe 1

Sortieren mit eigener Klasse Sort: Zahlen aus Datei, auf- oder absteigend

Zehn Zahlen stehen in einer Textdatei. Das Programm liest sie in ein Array und fragt dann, ob auf- oder absteigend sortiert werden soll. Sortiert wird mit zwei Methoden, die in einer eigenen Klasse Sort stehen. So kann jedes andere Programm sie ebenfalls benutzen. Rechts steht jeweils die Datei des aktuellen Teils, die Zeilen zum Schritt sind hervorgehoben. Mit Weiter geht es Schritt für Schritt voran.

Die Aufgabe

Aufgabe 10.1

Schreiben Sie ein Java-Programm A10_1, welches zunächst ein unsortiertes eindimensionales Zahlenarray a aus der Datei eingabe_10_1.txt einliest. Es folgt dann eine Abfrage, ob das Array aufsteigend oder absteigend sortiert werden soll. Zum Sortieren verwenden Sie zwei Methoden sortUp und sortDown, die sie in der Klasse Sort (Datei Sort.java) hinterlegen, weil damit zu rechnen ist, dass die beiden Sortiermethoden auch in anderen Programmen benötigt werden. Achten Sie darauf, dass die beiden Sortiermethoden hinsichtlich der Länge des Arrays flexibel sind.

Hinweis: Zur Realisierung der beiden Methoden können Sie sich an Ihrer Lösung der Aufgabe 8.1 orientieren.

Die Datei eingabe_10_1.txt gehört zum Blatt. Sie enthält eine Zeile:

3 16 7 22 9 5 13 1 4 8

Gebraucht werden zwei Dateien. Sort.java enthält nur die beiden Sortiermethoden sortUp (aufsteigend, die kleinste Zahl zuerst) und sortDown (absteigend, die größte zuerst). A10_1.java ist das Hauptprogramm: einlesen, fragen, sortieren lassen, ausgeben.

„Flexibel hinsichtlich der Länge“ heißt: Die Methoden dürfen nicht mit 10 Zahlen rechnen. Sie müssen für jedes Array funktionieren, auch für eines mit 5 oder 1000 Zahlen.

Merke: Eine Methode, die mehrere Programme brauchen, gehört in eine eigene Klasse. Aufgerufen wird sie dann mit dem Klassennamen davor: Sort.sortUp(a).
  1. Die Klasse Sort anlegen.
  2. Den Kopf von sortUp schreiben.
  3. Die zwei Schleifen von „Sortieren durch Vertauschen“.
  4. Nachbarn vergleichen und tauschen.
  5. Alle Durchläufe am Beispiel.
  6. sortDown: nur der Vergleich ändert sich.
  7. Im Hauptprogramm die Zahlen in der Datei zählen.
  8. Das Array anlegen und füllen.
  9. Eine Methode zum Ausgeben.
  10. Fragen und sortieren lassen.
  11. Testläufe, auch mit einer anderen Länge.

Eine eigene Datei für die Klasse Sort

class Sort {
}

Bisher stand jedes Programm in einer einzigen Klasse mit main. Jetzt kommen die Sortiermethoden in eine eigene Klasse Sort. Eine Klasse steht in einer Datei mit ihrem Namen, also in Sort.java.

Sort hat kein main. Man kann sie nicht selbst starten; sie stellt nur Methoden für andere Programme bereit. Liegen beide Dateien im selben Ordner, findet Java die Klasse beim Übersetzen von selbst.

Aus Skript 5, Folien 5-70 und 5-71 („Wiederverwendbarkeit von Code“): Beispiel ggT: TestEuklid enthält nur main, ggtEuklid alle anderen Methoden. main ruft sie mit dem Namen der Klasse davor auf: ggtEuklid.ggT(a, b).

Der Kopf von sortUp

    // sortiert a aufsteigend: Sortieren durch Vertauschen    static void sortUp (int[] a) {

sortUp bekommt das Array als Parameter int[] a. Eine Länge steht nicht im Kopf: Die Methode nimmt jedes int-Array.

Der Rückgabetyp ist void, die Methode gibt also nichts zurück. Das reicht, weil die Methode das Array des Aufrufers selbst umsortiert. Bei einem Array wird beim Aufruf nur der Verweis kopiert, nicht die Zahlen. Der Parameter a in sortUp zeigt deshalb auf dasselbe Array wie die Variable im Hauptprogramm.

Aus Skript 5, Folie 5-45 („Arrays als Parameter“): Bei Arrays wird nur die Referenz (der Verweis) kopiert, nicht das Array selbst. Ändert die Methode b[3], ändert sich auch a[3] beim Aufrufer („Alias-Effekt“).
Noch 10 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 1Die Klasse Sort

sortUp und sortDown in Sort.java

Start
3
16
7
22
9
5
13
1
4
8
i = 0
3
7
16
9
5
13
1
4
8
22
i = 1
3
7
9
5
13
1
4
8
16
22
i = 2
3
7
5
9
1
4
8
13
16
22
i = 3
3
5
7
1
4
8
9
13
16
22
i = 4
3
5
1
4
7
8
9
13
16
22
i = 5
3
1
4
5
7
8
9
13
16
22
i = 6
1
3
4
5
7
8
9
13
16
22
i = 7
1
3
4
5
7
8
9
13
16
22
i = 8
1
3
4
5
7
8
9
13
16
22
class Sort {     // sortiert a aufsteigend: Sortieren durch Vertauschen    static void sortUp (int[] a) {        for (int i = 0; i < a.length - 1; i++) {            for (int j = 0; j < a.length - 1 - i; j++) {                if (a[j] > a[j + 1]) {                    int h = a[j];                    a[j] = a[j + 1];                    a[j + 1] = h;                }            }        }    }     // sortiert a absteigend: nur der Vergleich ist umgedreht    static void sortDown (int[] a) {        for (int i = 0; i < a.length - 1; i++) {            for (int j = 0; j < a.length - 1 - i; j++) {                if (a[j] < a[j + 1]) {                    int h = a[j];                    a[j] = a[j + 1];                    a[j + 1] = h;                }            }        }    }}
LegendeBeide Dateien des Programms.