smart | Webentwicklung
Alles rund um HTML5, PHP, WordPress & Co.

Hash in Ruby sortieren

7. August 2012
Stephan
Ruby

Aktuell stand ich gerade vor dem Problem, dass ich einen Hash in Ruby habe, der sortiert werden sollte. Dabei ging es darum, dass in diesem Hash die Gesamtpunkte eines Teams unter der jeweiligen Team-ID gespeichert sind und ich den Hash absteigend nach den Gesamtpunkten sortieren wollte.

Generell ist ein Hash nichts weiter als eine Liste von ungeordneten Schlüssel-Wert-Paaren (Key-Value-Paaren) (was sich ab der Ruby Version 1.9 geändert hat).

Um also nun einen Hash in Ruby sortieren zu können, gibt es die Methoden sort und sort_by, die das Enumerable-Modul bereitstellt, welches in der Hash-Klasse eingebunden ist.

Hash-Werte sortieren ohne Beibehaltung der Schlüssel (Keys)

Nehmen wir an, wir haben folgenden Hash:

# {team_id: score}
team_scores = {
    team_a: 48,
    team_b: 28,
    team_c: 66
}

Wenn wir nun nur die Punkte sortiert haben möchten ohne Beibehaltung der Team-IDs, dann könnten wir einfach Folgendes machen:

team_scores.values.sort 
# => [28, 48, 66]

Hierdurch erhalten wir ein Array, dass die Punkte in aufsteigender Reihenfolge enthält. Für eine absteigende Reihenfolge der Punkte können wir reverse nutzen:

team_scores.values.sort.reverse 
# => [66 48, 28]

Hash-Werte sortieren mit Beibehaltung der Schlüssel (Keys)

Wenn wir die Schlüssel beibehalten möchten, dann können wir sort_by benutzen:

team_scores.sort_by{ |team_id, score| score } 
# => [ [:team_b, 28], [:team_a, 48], [:team_c, 66] ]

Wir wir sehen erhalten wir so aber nur ein Array. Um nun wieder ein Hash zu erhalten brauchen wir nur Folgendes tun:

Hash[
    team_scores.sort_by{ |team_id, score| score }] 
]
# => {:team_b => 28, :team_a => 48, :team_c => 66}

Komplexere Hash-Struktur sortieren

Nun eine Hash-Struktur, die etwas komplexer ist:

# {team_id: { name, score}
team_scores = {
    team_a: {name: 'Team A', score: 48},
    team_b: {name: 'Team B', score: 28},
    team_c: {name: 'Team C', score: 66}
}

Sortieren nach Punkten:

Hash[
    team_scores.sort_by{ |team_id, data| data[score] }] 
]
# => { team_a: {name: 'Team B', score: 28}, team_b: {name: 'Team A', score: 48}, team_c: {name: 'Team C', score: 66} }

Fazit

Das Sortieren von Hashes in Ruby ist wie ihr gesehen habt sehr leicht umzusetzen.

Habt ihr auch schon mal einen Hash in Ruby sortieren müssen?

Kommentare  
0 Kommentare vorhanden
0 Trackbacks/Pingbacks vorhanden
Du bist herzlich eingeladen auch ein Kommentar zu hinterlassen!
Kommentar schreiben

Vielen Dank für dein Kommentar!