Instantánea de inventario
Parte de la sección Lógica y flujo del Journey de Ruby de Coddy — lección 55 de 56.
Un informe de inventario que pone en práctica hashes, cadenas de Enumerable, group_by y un toque de formato.
Desafío
IntermedioSe proporciona el array inventory. Cada elemento es un hash con :name, :category, :qty, y :price.
Imprime cuatro líneas:
- El valor total del inventario de todos los artículos (
qty * price, sumados), impreso como un entero. - La categoría con el mayor número de artículos, en el formato
Top category: <name> (<count>). Los empates se resuelven alfabéticamente por el nombre de la categoría. - Nombres de los artículos out of stock (
qty == 0), ordenados alfabéticamente, unidos por,. Si no hay ninguno, imprime(none). - Nombres de los 3 artículos más caros por precio unitario, del más alto al más bajo, unidos por
,. Los empates se resuelven alfabéticamente por nombre.
Para el inventario por defecto, la salida es:
232
Top category: food (3)
milk
chair, lamp, milkHoja de referencia
Trabajando con arreglos de hashes usando métodos de Enumerable:
# Suma con cálculo por elemento
inventory.sum { |item| item[:qty] * item[:price] }
# Agrupar por una clave y contar
groups = inventory.group_by { |item| item[:category] }
groups.max_by { |cat, items| [items.count, ...] }
# Filtrar, ordenar y unir
inventory.select { |item| item[:qty] == 0 }
.map { |item| item[:name] }
.sort
.join(", ")
# Ordenar por múltiples criterios (los empates se resuelven alfabéticamente)
inventory.sort_by { |item| [-item[:price], item[:name]] }
.first(3)
.map { |item| item[:name] }
.join(", ")
Resolviendo empates alfabéticamente al usar max_by con conteos:
# El conteo más alto gana; en caso de empate, el primero alfabéticamente (negar cadena para max_by)
groups.max_by { |cat, items| [items.count, -cat.ord] }
# O usar min_by con el conteo negado + orden natural de cadenas
groups.sort_by { |cat, items| [-items.count, cat] }.first
Pruébalo tú mismo
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: print total value, top category, out-of-stock names, top 3 by price
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y flujo
1Strings en profundidad
Visión general de los métodos de StringInterpolación de StringsIterar sobre StringsSplit y JoinRepaso - String Weaver4Bloques, Procs y Lambdas
¿Qué es un bloque?do..end vs llavesLa palabra clave yieldParámetros de bloqueProcs y LambdasResumen - Iterador personalizado7Hashes Parte 2
Hash.new con valores por defectoIteración de HashesHashes anidadosFusión y transformaciónResumen - Contador de frecuencia10Proyecto - Registros de Estudiantes
Descripción general del proyectoAgregar estudiante5Potencia de Enumerable
Select y RejectEncadenando MapReduce / Injectcount, all?, any?, none?group_by y partitionsort_by, min_by, max_byResumen - Data Pipeline