<- Das Adressbuch ausgeben
Gute Programmiertechniken ->

Sortierung des Adressbuchs

Ein Arrays repräsentiert unser Adressbuch, weil die Einträge der Arrays eine bestimmte Reihenfolge haben. Nehmen wir an, wir wollen die Reihenfolge ändern. Wir wollen das Array nun in alphabetischer Reihenfolge anordnen. Wie stellen wir das an?

Array#sort wieder einmal

Wir haben bereits Array#sort benutzt, um Strings und Integers zu sortieren. Aber wie können wir eine komplexere Struktur sortieren?

Wenn das Standardverhalten nicht das ist, was Sie wollen, erlaubt es Array#sort Ihnen zu sagen, wie die Daten angeordnet werden sollen. Beginnen wir mit einem einfacheren Beispiel als das Adressbuch:


freunde = [
    [ "Josef", "Smith" ],
    [ "Herbert", "Adams"],  
    [ "Tim", "Koh" ]
]
                       

Wir wissen, dass Array#sort standardmässig nach den ersten Einträgen sortiert - in unserem Fall, nach den Vornamen. Wir möchten stattdessen aber nach dem Nachnamen sortieren. Array#sort ist kein Itrator, aber genauso wie ein Iterator erlaubt die Methode es Ihnen einen Block Code zu übergeben. Z.B. so:


freunde.sort do |a,b|  
    ...
end
                       

Dieser Code soll folgendes machen:

Zusammen mit diesen Informationen weiß die Sortierungsfunktion, wie das Array sortiert werden muss.

Werte zurückgeben

Wie gibt man einen Wert zurück? (en: return a value) Der Rückgabewert ist einfach die letzte ausgeführte Anweisung. Werfen wir einen Blick auf irb


>> num = 3
=> 3
>> 2 + 3
=> 5
                       

Das => 3 und das => 5 sind die Rückgabewerte dieser Anweisungen.

Der Operator <=>

Sortierung ist so gebräuchlich, so dass es einen Operator gibt, um Rückgabewerte zu vereinfachen. Der Operator <=> gibt -1, 0, oder 1, das Sie normal bekommen würden. Probieren Sie es in irb aus


>> 3 <=> 1  # 3 > 1, also gibt <=> 1 zurück
=> 1
>> 3 <=> 3  # 3 == 3, also gibt <=> 0 zurück
=> 0
>> 3 <=> 5  # 3 < 5, also gibt <=> -1 zurück
=> -1
>> "andy" <=> "sam" # "andy" kommt vor "sam"  
=> -1
                       

Sortieren nach den Nachnamen

Wir haben also:


freunde.sort do |a,b|  
    ...
end
                       

a und b sind Elemente des Arrays freunde. Das gewöhnliche "freunde.sort" ist äquivalent zu:


freunde.sort do |a,b|  
a[0] <=> b[0]   # Sortier nach dem ersten Eintrag
end
                       

Aber wir möchten nach dem zweiten Eintrag (Nachname) sortieren. Also machen wir stattdessen:


freunde = freunde.sort do |a,b|  
    a[1] <=> b[1]   # Sortier nach dem zweiten Eintrag  
end
# Nun ist 'freunde' nach den Nachnamen sortiert.
                       

Sortierung des Adressbuchs

Nun da wir Array#sort besser verstehen, sind wir soweit eine angepasste Sortiermethode für das Adressbuch anzugeben. Wir haben:


adressbuch.sort do |person_a, person_b|  
    ...
end
                       

person_a und person_b sind beides Personenstrukturen. Wir können z.B. diese nach dem Vornamen in alphabetischer Reihenfolge sortieren.


# p_a == "person a"
adressbuch.sort do |p_a, p_b|
    p_a["vorname"] <=> p_b["vorname"]  
end
                       

Übungen

<- Das Adressbuch ausgeben
Gute Programmiertechniken ->