データトランスフォーマー
CoddyのRubyジャーニー「ロジックとフロー」セクションの一部 — レッスン 56/56。
最終課題では、データセットをサマリーレポートに再構成します。フィルタリング、マッピング、グルーピング、エラーハンドリング、およびメソッド定義を1つのプログラムに組み合わせます。
チャレンジ
中級配列 students が与えられています。各エントリは :id、:grades(整数の配列、空の場合あり)、および :subjects(文字列の配列)を持つハッシュです。
2つのキーを持つハッシュを返すメソッド transform_dataset(students) を定義してください:
:qualified_ids:少なくとも1つの成績を持ち、かつすべての成績が70を厳密に超えている(all?を使用)生徒の:idをソートした配列。:subject_counts:対象となる生徒が履修している各科目を、その科目を履修している対象生徒の数にマッピングしたハッシュ。
生徒の :grades 配列が空の場合、その生徒は対象外(not qualified)として、静かにスキップしてください。
次に、メソッドを呼び出して以下を出力してください:
- 対象となるIDを
,で連結し、先頭にQualified:を付けたもの。対象者がいない場合は、Qualified: (none)と出力してください。 - 各科目ごとに1行ずつ(アルファベット順にソート)、
<subject>: <count>の形式で出力してください。
デフォルトの students の場合、出力は以下のようになります:
Qualified: S1, S4
biology: 1
history: 1
math: 2
physics: 1チートシート
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
フォールバックとソートされたキーを使用して結果を出力する:
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?は空の配列に対してfalseを返します。空の成績を防ぐために、まずany?を使用してください。Hash.new(0)は存在しないキーを0で初期化します。カウントに便利です。- ハッシュに対して
.sortを実行すると、アルファベット順にソートされた[key, value]のペアが返されます。
自分で試してみよう
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) を定義し、{ qualified_ids:, subject_counts: } を返す
# TODO: 条件を満たすID(qualified IDs)と科目ごとの数(subject counts)を出力する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。