Snapshot do Inventário
Parte da seção Lógica e Fluxo do Journey de Ruby da Coddy — lição 55 de 56.
Um relatório de inventário que exercita hashes, encadeamentos Enumerable, group_by e um toque de formatação.
Desafio
MédioO array inventory é fornecido. Cada item é um hash com :name, :category, :qty, e :price.
Imprima quatro linhas:
- O valor total do inventário de todos os itens (
qty * price, somados), impresso como um número inteiro. - A categoria com a maior contagem de itens, no formato
Top category: <name> (<count>). Empates são resolvidos alfabeticamente pelo nome da categoria. - Nomes dos itens out of stock (
qty == 0), ordenados alfabeticamente, unidos por,. Se não houver nenhum, imprima(none). - Nomes dos 3 itens mais caros por preço unitário, do maior para o menor, unidos por
,. Empates são resolvidos pelo nome alfabeticamente.
Para o inventário padrão, a saída é:
232
Top category: food (3)
milk
chair, lamp, milkFolha de consulta
Trabalhando com arrays de hashes usando métodos Enumerable:
# Soma com cálculo por elemento
inventory.sum { |item| item[:qty] * item[:price] }
# Agrupar por uma chave e contar
groups = inventory.group_by { |item| item[:category] }
groups.max_by { |cat, items| [items.count, ...] }
# Filtrar, ordenar e juntar
inventory.select { |item| item[:qty] == 0 }
.map { |item| item[:name] }
.sort
.join(", ")
# Ordenar por múltiplos critérios (desempate em ordem alfabética)
inventory.sort_by { |item| [-item[:price], item[:name]] }
.first(3)
.map { |item| item[:name] }
.join(", ")
Desempatando em ordem alfabética ao usar max_by com contagens:
# A contagem maior vence; em caso de empate, o primeiro em ordem alfabética (negue a string para max_by)
groups.max_by { |cat, items| [items.count, -cat.ord] }
# Ou use min_by na contagem negada + ordem natural da string
groups.sort_by { |cat, items| [-items.count, cat] }.first
Experimente você mesmo
inventory = [
{ name: "apple", category: "food", qty: 10, price: 2 },
{ name: "bread", category: "food", qty: 4, price: 3 },
{ name: "milk", category: "food", qty: 0, price: 4 },
{ name: "chair", category: "furniture", qty: 2, price: 35 },
{ name: "lamp", category: "furniture", qty: 5, price: 20 },
{ name: "pencil", category: "stationery", qty: 30, price: 1 }
]
# TODO: imprimir valor total, categoria principal, nomes fora de estoque, os 3 mais caros por preço
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