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"] # nilHash.new(default) muda isso. Toda chave ausente retorna o valor que você passou:
scores = Hash.new(0)
puts scores["Alice"] # 0Esta é 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.
Desafio
FácilLeia 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: 20Se 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
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 em Profundidade
Visão Geral dos Métodos de StringInterpolação de StringsPercorrendo StringsDividir e UnirRecapitulação - String Weaver4Blocos, Procs e Lambdas
O que é um Bloco?do..end vs ChavesA Palavra-chave yieldParâmetros de BlocoProcs e LambdasRevisão - Iterador Personalizado7Hashes - Parte 2
Hash.new com Valores PadrãoIterando sobre 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 / WhenRevisão - Prática com intervalos5Potência do Enumerable
Select e RejectEncadeando MapReduce / Injectcount, all?, any?, none?group_by e partitionsort_by, min_by, max_byRecapitulação - Pipeline de DadosPratique por conta própria: Compilador de Ruby online