Menu
Coddy logo textTech

group_by und partition

Teil des Abschnitts Logik & Programmfluss der Ruby-Journey von Coddy. Lektion 25 von 56.

Manchmal möchten Sie eine Sammlung aufteilen, anstatt sie zu filtern. Zwei Methoden decken die meisten Fälle ab.

group_by nimmt einen Block entgegen und gibt einen Hash zurück. Jedes eindeutige Blockergebnis wird zu einem Schlüssel, der einer Liste der Elemente zugewiesen wird, die dieses Ergebnis erzeugt haben:

words = ["hi", "hello", "yo", "hey", "bonjour"]
by_length = words.group_by { |w| w.length }
puts by_length.inspect
# {2=>["hi", "yo"], 5=>["hello"], 3=>["hey"], 7=>["bonjour"]}

Es ist die sauberste Möglichkeit, Elemente in einem Durchgang zu gruppieren.

partition ist die binäre Variante: Es gibt ein Paar von Arrays zurück, die Elemente, bei denen der Block true war, und den Rest:

evens, odds = [1, 2, 3, 4, 5].partition { |n| n.even? }
puts evens.inspect   # [2, 4]
puts odds.inspect    # [1, 3, 5]

Verwende partition, wenn es genau zwei Buckets gibt, und group_by, wenn es viele sein können.

challenge icon

Aufgabe

Mittel

Lies eine kommagetrennte Liste von name:score-Einträgen ein (z. B. Alice:88,Bob:42,Charlie:75). Verwende group_by gefolgt von partition, um einen kleinen Bericht zu erstellen.

Schritte:

  1. Parse jeden Eintrag in ein [name, score]-Paar (wobei score eine Ganzzahl ist)
  2. Führe ein group_by nach dem ersten Buchstaben von name (in Großbuchstaben) durch
  3. Für jede Buchstabengruppe, in alphabetischer Reihenfolge (alphabetical order), teile die Einträge mit partition in bestanden (score >= 60) und nicht bestanden auf, und gib dann eine Zeile pro Gruppe aus:
<LETTER>: pass=<names_passing_joined_by_comma> fail=<names_failing_joined_by_comma>

Innerhalb jeder Gruppe erscheinen die Namen in ihrer ursprünglichen Reihenfolge. Wenn eine Seite keine Namen enthält, lasse sie leer (z. B. fail=).

Für die Eingabe Alice:88,Adam:42,Bob:75,Beth:55,Cara:90 lautet die Ausgabe:

A: pass=Alice fail=Adam
B: pass=Bob fail=Beth
C: pass=Cara fail=

Probier es selbst

entries = gets.chomp.split(",").map do |s|
  name, score = s.split(":")
  [name, score.to_i]
end

# TODO: gruppiere nach erstem Buchstaben (Großbuchstabe), partitioniere jede Gruppe nach score >= 60,
#       drucke 'X: pass=... fail=...' in alphabetischer Buchstabenreihenfolge
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Logik & Programmfluss

Übe selbstständig: Online-Ruby-Compiler