Menu
Coddy logo textTech

Transformateur de données

Fait partie de la section Logique et Flux du Journey Ruby de Coddy — leçon 56 sur 56.

Le défi final : transformer un jeu de données en un rapport de synthèse. Combinez le filtrage, le mappage, le regroupement, la gestion des erreurs et la définition de méthodes dans un seul programme.

challenge icon

Défi

Moyen

Le tableau students est fourni. Chaque entrée est un hash avec :id, :grades (un tableau d'entiers, potentiellement vide), et :subjects (un tableau de chaînes de caractères).

Définissez une méthode transform_dataset(students) qui retourne un hash avec deux clés :

  • :qualified_ids : un tableau trié des :ids des étudiants qui ont au moins une note et dont toutes les notes sont strictement supérieures à 70 (utilisez all?).
  • :subject_counts : un hash associant chaque matière suivie par les étudiants qualifiés au nombre d'étudiants qualifiés la suivant.

Si le tableau :grades d'un étudiant est vide, il n'est pas qualifié, ignorez-le silencieusement.

Ensuite, appelez la méthode et affichez :

  1. Les IDs qualifiés joints par , , préfixés par Qualified: . Si aucun, affichez Qualified: (none).
  2. Une ligne par matière (triée par ordre alphabétique) au format <subject>: <count>.

Pour le tableau students par défaut, la sortie est :

Qualified: S1, S4
biology: 1
history: 1
math: 2
physics: 1

Aide-mémoire

Combinez le filtrage, le mappage, le regroupement et le formatage de sortie en 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

Affichez les résultats avec une valeur de repli et des clés triées :

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? renvoie false sur les tableaux vides — utilisez d'abord any? pour vous prémunir contre les notes vides.
  • Hash.new(0) initialise les clés manquantes à 0, ce qui est utile pour le comptage.
  • .sort sur un hash renvoie des paires [key, value] triées par ordre alphabétique.

Essayez vous-même

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"] }
]

# À FAIRE : def transform_dataset(students), retourner { qualified_ids:, subject_counts: }
# À FAIRE : afficher les identifiants qualifiés et le décompte des matières
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Logique et Flux