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.
Défi
MoyenLe 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(utilisezall?).: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 :
- Les IDs qualifiés joints par
,, préfixés parQualified:. Si aucun, affichezQualified: (none). - 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: 1Aide-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?renvoiefalsesur les tableaux vides — utilisez d'abordany?pour vous prémunir contre les notes vides.Hash.new(0)initialise les clés manquantes à0, ce qui est utile pour le comptage..sortsur 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
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
1Les chaînes de caractères en profondeur
Aperçu des méthodes de chaînesInterpolation de chaînesParcourir les chaînesSplit et JoinRécapitulatif - String Weaver4Blocs, Procs & Lambdas
Qu'est-ce qu'un bloc ?do..end vs AccoladesLe mot-clé yieldParamètres de blocProcs et LambdasRécapitulatif - Itérateur personnalisé7Hashes - Partie 2
Hash.new avec des valeurs par défautItérer sur les HashesHashes imbriquésFusion et transformationRécapitulatif - Compteur de fréquence10Projet - Dossiers étudiants
Présentation du projetAjouter un étudiant2Intervalles
Qu'est-ce qu'un intervalle ?Méthodes d'intervalleLes intervalles dans Case / WhenRécapitulatif - Pratique des intervalles5La puissance d'Enumerable
Select et RejectChaîner MapReduce / Injectcount, all?, any?, none?group_by et partitionsort_by, min_by, max_byRécapitulatif - Data Pipeline