group_by und partition
Teil des Abschnitts Logik und Ablauf 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.
Aufgabe
MittelLies eine durch Kommas getrennte 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:
- Parse jeden Eintrag in ein
[name, score]-Paar (score ist eine Ganzzahl) - Wende
group_byauf den ersten Buchstaben vonnamedes Paares an (Großbuchstabe) - Teile für jede Buchstabengruppe in alphabetischer Reihenfolge die Einträge mit
partitionin 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
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik und Ablauf
1Strings im Detail
Überblick über String-MethodenString-InterpolationStrings durchlaufenSplitten und VerbindenRückblick – String Weaver4Blocks, Procs & Lambdas
Was ist ein Block?do..end vs. geschweifte KlammernDas Schlüsselwort yieldBlock-ParameterProcs und LambdasRückblick – Benutzerdefinierter Iterator2Bereiche
Was ist ein Bereich?BereichsmethodenBereiche in Case / WhenWiederholung – Übung zu Bereichen5Das Enumerable-Kraftpaket
Select und RejectMap verkettenReduce / Injectcount, all?, any?, none?group_by und partitionsort_by, min_by, max_byZusammenfassung – Datenpipeline8Fortgeschrittene Entscheidungsfindung
Case mit Klassen & Regexwhen mit mehreren WertenTernärer OperatorInline-if / unlessRückblick – NotenklassifiziererÜbe selbstständig: Online-Ruby-Compiler