Menu
Coddy logo textTech

Hash.new com Valores Padrão

Parte da seção Lógica e Fluxo do Journey de Ruby da Coddy. Lição 33 de 56.

Por padrão, procurar uma chave ausente em um hash retorna nil:

scores = {}
puts scores["Alice"]   # nil

Hash.new(default) muda isso. Toda chave ausente retorna o valor que você passou:

scores = Hash.new(0)
puts scores["Alice"]   # 0

Esta é a maneira mais limpa de escrever um contador. Você não precisa verificar 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) define o padrão como 0, mas não armazena a chave quando você a lê. O hash permanece vazio até que você faça uma atribuição. Portanto, quando você escreve counts[letter] += 1, a chave é adicionada com o novo valor.

challenge icon

Desafio

Fácil

Leia uma lista separada por vírgulas de entradas category:amount (por exemplo, food:12,gas:30,food:8,books:25,gas:15). Construa um hash de totais por categoria usando Hash.new(0) e, em seguida, imprima apenas as categorias cujo total seja pelo menos 20, uma por linha, ordenadas pelo total em ordem decrescente:

<category>: <total>

Para a entrada de exemplo acima, a saída é:

gas: 45
books: 25
food: 20

Se nenhuma categoria atingir 20, não imprima nada.

Experimente você mesmo

entries = gets.chomp.split(",")

# TODO: totals = Hash.new(0); acumule o valor por categoria;
#       então imprima as categorias com total >= 20, ordenadas por total desc
quiz iconTeste seus conhecimentos

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

Pratique por conta própria: Compilador de Ruby online