我在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
我已经读过哈希迭代器以随机顺序返回哈希值,但到目前为止这似乎有效。
现在我需要freqs哈希只包含20个最常用的单词。我怎样才能做到这一点?谢谢你的阅读。
答案 0 :(得分:4)
正如您可能已经看到的那样,它保持排序的原因是因为您致电Enumerable#sort_by
会将Hash
更改为Array
。从该方法的文档:
sort_by的当前实现生成一个包含原始集合元素和映射值的元组数组。
一旦你有了排序数组,你可以使用Array#first
来获得前20名:
top20 = freqs.first(20)
如果需要,可以在结果上使用to_hash
将其返回Hash
,但不会再对其进行排序。