Menu
Coddy logo textTech

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.

challenge icon

Aufgabe

Mittel

Das 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 über 70 liegen (verwenden Sie all?).
  • :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:

  1. Die qualifizierten IDs, verbunden durch , , mit dem Präfix Qualified: . Wenn keine vorhanden sind, geben Sie Qualified: (none) aus.
  2. 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: 1

Spickzettel

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 Arrays false zurück — verwenden Sie zuerst any?, um sich gegen leere Noten (grades) abzusichern.
  • Hash.new(0) initialisiert fehlende Schlüssel mit 0, was nützlich für Zählvorgänge ist.
  • .sort auf 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
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