Transformador de Dados
Parte da seção Lógica e Fluxo do Journey de Ruby da Coddy — lição 56 de 56.
O desafio final: remodelar um conjunto de dados em um relatório de resumo. Combine filtragem, mapeamento, agrupamento, tratamento de erros e definição de métodos em um único programa.
Desafio
MédioO array students é fornecido. Cada entrada é um hash com :id, :grades (um array de inteiros, possivelmente vazio) e :subjects (um array de strings).
Defina um método transform_dataset(students) que retorne um hash com duas chaves:
:qualified_ids: um array ordenado dos:ids dos estudantes que possuem pelo menos uma nota e todas as notas estritamente acima de70(useall?).:subject_counts: um hash mapeando cada disciplina cursada pelos estudantes qualificados para o número de estudantes qualificados que a cursam.
Se o array :grades de um estudante estiver vazio, ele não está qualificado, ignore-o silenciosamente.
Em seguida, chame o método e imprima:
- Os IDs qualificados unidos por
,, prefixados comQualified:. Se não houver nenhum, imprimaQualified: (none). - Uma linha por disciplina (ordenada alfabeticamente) no formato
<subject>: <count>.
Para o students padrão, a saída é:
Qualified: S1, S4
biology: 1
history: 1
math: 2
physics: 1Folha de consulta
Combine filtragem, mapeamento, agrupamento e formatação de saída em 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
Imprima os resultados com fallback e chaves ordenadas:
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?retornafalseem arrays vazios — useany?primeiro para se proteger contra notas vazias.Hash.new(0)inicializa chaves ausentes com0, útil para contagem..sortem um hash retorna pares[key, value]ordenados alfabeticamente.
Experimente você mesmo
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), retornar { qualified_ids:, subject_counts: }
# TODO: imprimir IDs qualificados e contagem de disciplinas
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Lógica e Fluxo
1Strings a Fundo
Visão Geral de Métodos de StringInterpolação de StringsIterando sobre StringsSplit e JoinRecapitulação - String Weaver4Blocos, Procs e Lambdas
O que é um Bloco?do..end vs ChavesA palavra-chave yieldParâmetros de BlocoProcs e LambdasRecapitulação - Iterador Customizado7Hashes Parte 2
Hash.new com Valores PadrãoIterando em HashesHashes AninhadosMesclando e TransformandoRecapitulação - Contador de Frequência10Projeto - Registros de Alunos
Visão Geral do ProjetoAdicionar Aluno2Intervalos
O que é um Intervalo?Métodos de IntervaloIntervalos em Case / WhenRecapitulação - Prática com Intervalos5O Poder do Enumerable
Select e RejectEncadeando o MapReduce / Injectcount, all?, any?, none?group_by e partitionsort_by, min_by, max_byRecapitulação - Data Pipeline