Hash.new con valores predeterminados
Parte de la sección Lógica y flujo del Journey de Ruby de Coddy. Lección 33 de 56.
De forma predeterminada, buscar una clave que falta en un hash devuelve nil:
scores = {}
puts scores["Alice"] # nilHash.new(default) cambia eso. Cada clave faltante devuelve el valor que proporcionaste:
scores = Hash.new(0)
puts scores["Alice"] # 0Esta es la forma más limpia de escribir un contador. No necesitas comprobar if scores[name].nil? antes de incrementar:
counts = Hash.new(0)
["a", "b", "a", "c", "a"].each do |letter|
counts[letter] += 1
end
puts counts.inspect # {"a"=>3, "b"=>1, "c"=>1}Importante: Hash.new(0) establece el valor predeterminado en 0, pero no almacena la clave cuando la lees. El hash permanece vacío hasta que asignas un valor. Así que, una vez que escribes counts[letter] += 1, la clave se añade con el nuevo valor.
Desafío
FácilLee una lista separada por comas de entradas category:amount (por ejemplo, food:12,gas:30,food:8,books:25,gas:15). Construye un hash de totales por categoría usando Hash.new(0) y, después, imprime solo las categorías cuyo total sea como mínimo 20, una por línea, ordenadas por total de forma descendente:
<category>: <total>Para la entrada de ejemplo anterior, la salida es:
gas: 45
books: 25
food: 20Si ninguna categoría alcanza 20, no imprimas nada.
Pruébalo tú mismo
entries = gets.chomp.split(",")
# TODO: totals = Hash.new(0); acumular cantidad por categoría;
# luego imprimir categorías con total >= 20, ordenadas por total desc
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
1Cadenas en profundidad
Descripción general de los métodos de cadenasInterpolación de cadenasIteración sobre cadenasSeparar y unirRepaso: Tejedor de cadenas4Bloques, Procs y Lambdas
¿Qué es un bloque?do..end frente a llavesLa palabra clave yieldParámetros de bloqueProcs y LambdasRepaso: iterador personalizado7Hashes Parte 2
Hash.new con valores predeterminadosIteración de hashesHashes anidadosCombinación y transformaciónRepaso: contador de frecuencias10Proyecto - Registros de estudiantes
Descripción general del proyectoAgregar estudiante5Potencia Enumerable
Select y RejectEncadenamiento de MapReduce / Injectcount, all?, any?, none?group_by y partitionsort_by, min_by, max_byRepaso: canalización de datosPractica por tu cuenta: Compilador de Ruby online