Come dividere un hash basato sui valori in Ruby?
Domanda
Ho un hash in Ruby che si memorizza la frequenza delle parole di una stringa, con la parola come la chiave e la frequenza come valore.
words = a_string.split(/ /)
freqs = Hash.new(0)
words.each { |word| freqs[word] += 1 }
freqs = freqs.sort_by {|x,y| y }
freqs.reverse!
freqs.each do |word, freq|
puts word+' '+freq.to_s
end
Ho letto che iteratori hash restituiscono l'hash in un ordine casuale, ma questo sembra funzionare finora.
Ora ho bisogno di freqs hash per contenere solo le 20 parole più frequenti. Come posso fare questo? Grazie per la lettura.
Soluzione
Come probabilmente avete visto, il motivo per cui rimane allineati è perché la chiamata a Enumerable#sort_by
cambia la tua Hash
in un Array
. Dalla documentazione per tale metodo:
L'implementazione corrente di sort_by genera una matrice di tuple contenenti l'elemento collezione originale e il valore mappato.
Una volta che avete il vostro array ordinato, si potrebbe utilizzare Array#first
per ottenere la top 20:
top20 = freqs.first(20)
Se si desidera, è possibile utilizzare to_hash
sul risultato per tornare di nuovo ad un Hash
, ma non sarà più ordinato.