2010-08-31 5 views
0

J'ai un hachage dans Ruby qui stocke la fréquence des mots d'une chaîne, avec le mot comme clé et la fréquence comme valeur.Comment diviser un hachage basé sur des valeurs dans Ruby?

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 

J'ai lu que itérateurs de hachage retourner le hachage dans un ordre aléatoire, mais cela semble fonctionner jusqu'à présent.

Maintenant, j'ai besoin de freqs hash pour ne contenir que les 20 mots les plus fréquents. Comment puis-je faire ceci? Merci d'avoir lu.

Répondre

3

Comme vous l'avez probablement déjà vu, la raison pour laquelle il reste trié est que votre appel à Enumerable#sort_by change votre Hash en Array. De la documentation de cette méthode:

L'implémentation actuelle de sort_by génère un tableau de tuples contenant l'élément de collection d'origine et la valeur mappée.

Une fois que vous avez votre tableau trié, vous pouvez simplement utiliser Array#first pour obtenir le top 20:

top20 = freqs.first(20) 

Si vous voulez, vous pouvez utiliser to_hash sur le résultat pour le retourner à un Hash, mais il ne sera plus trié.

+0

Ah, c'est logique. Merci de votre aide. – ben

Questions connexes