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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top