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.
Aufgabe
MittelLies 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:
- Parse jeden Eintrag in ein
[name, score]-Paar (wobeiscoreeine Ganzzahl ist) - Führe ein
group_bynach dem ersten Buchstaben vonname(in Großbuchstaben) durch - Für jede Buchstabengruppe, in alphabetischer Reihenfolge (
alphabeticalorder), teile die Einträge mitpartitionin 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 & Programmfluss
1Strings im Detail
String-Methoden im ÜberblickString-InterpolationIterieren über StringsSplit und JoinRückblick – String Weaver4Blöcke, Procs & Lambdas
Was ist ein Block?do..end vs. geschweifte KlammernDas yield-SchlüsselwortBlock-ParameterProcs und LambdasZusammenfassung – Eigener Iterator7Hashes Teil 2
Hash.new mit StandardwertenIterieren über HashesVerschachtelte HashesZusammenführen und TransformierenRückblick – Häufigkeitszähler10Projekt - Studentenverwaltung
ProjektübersichtStudent hinzufügen5Enumerable-Kraftpaket
Select und RejectMap-VerkettungReduce / Injectcount, all?, any?, none?group_by und partitionsort_by, min_by, max_byZusammenfassung – Data Pipeline8Fortgeschrittene Entscheidungslogik
Case mit Klassen & RegexMulti-Value whenTernärer OperatorInline if / unlessRückblick – Noten-KlassifiziererÜbe selbstständig: Online-Ruby-Compiler