Daten-Transformer
Teil des Abschnitts Logik & Programmfluss der Ruby-Journey von Coddy — Lektion 56 von 56.
Die Abschlussherausforderung: Formen Sie einen Datensatz in einen Zusammenfassungsbericht um. Kombinieren Sie Filtern, Mapping, Gruppierung, Fehlerbehandlung und Methodendefinition in einem Programm.
Aufgabe
MittelDas Array students ist gegeben. Jeder Eintrag ist ein Hash mit :id, :grades (ein Array von Ganzzahlen, möglicherweise leer) und :subjects (ein Array von Strings).
Definieren Sie eine Methode transform_dataset(students), die einen Hash mit zwei Schlüsseln zurückgibt:
:qualified_ids: ein sortiertes Array der:ids von Studenten, die mindestens eine Note haben und bei denen alle Noten strikt über70liegen (verwenden Sieall?).:subject_counts: ein Hash, der jedes Fach, das von den qualifizierten Studenten belegt wurde, auf die Anzahl der qualifizierten Studenten abbildet, die dieses Fach belegen.
Wenn das :grades-Array eines Studenten leer ist, ist dieser nicht qualifiziert; überspringen Sie ihn stillschweigend.
Rufen Sie dann die Methode auf und geben Sie Folgendes aus:
- Die qualifizierten IDs, verbunden durch
,, mit dem PräfixQualified:. Wenn keine vorhanden sind, geben SieQualified: (none)aus. - Eine Zeile pro Fach (alphabetisch sortiert) im Format
<subject>: <count>.
Für das standardmäßige students-Array lautet die Ausgabe:
Qualified: S1, S4
biology: 1
history: 1
math: 2
physics: 1Spickzettel
Kombinieren Sie Filtern, Mapping, Gruppierung und Ausgabeformatierung in Ruby:
def transform_dataset(students)
qualified = students.select do |s|
s[:grades].any? && s[:grades].all? { |g| g > 70 }
end
qualified_ids = qualified.map { |s| s[:id] }.sort
subject_counts = Hash.new(0)
qualified.each do |s|
s[:subjects].each { |subj| subject_counts[subj] += 1 }
end
{ qualified_ids: qualified_ids, subject_counts: subject_counts }
end
Ergebnisse mit Fallback und sortierten Schlüsseln ausgeben:
result = transform_dataset(students)
ids = result[:qualified_ids]
puts "Qualified: #{ids.any? ? ids.join(', ') : '(none)'}"
result[:subject_counts].sort.each do |subject, count|
puts "#{subject}: #{count}"
end
all?gibt bei leeren Arraysfalsezurück — verwenden Sie zuerstany?, um sich gegen leere Noten (grades) abzusichern.Hash.new(0)initialisiert fehlende Schlüssel mit0, was nützlich für Zählvorgänge ist..sortauf einem Hash gibt alphabetisch sortierte[key, value]-Paare zurück.
Probier es selbst
students = [
{ id: "S1", grades: [85, 92, 78], subjects: ["math", "physics"] },
{ id: "S2", grades: [65, 80, 90], subjects: ["math", "biology"] },
{ id: "S3", grades: [], subjects: ["art"] },
{ id: "S4", grades: [88, 95], subjects: ["math", "biology", "history"] },
{ id: "S5", grades: [70, 75], subjects: ["chemistry"] }
]
# TODO: def transform_dataset(students), return { qualified_ids:, subject_counts: }
# TODO: Qualifizierte IDs und Fächeranzahl ausgeben
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