如何根据Ruby中的值拆分哈希?

时间:2010-08-31 01:29:14

标签: ruby hash frequency

我在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个最常用的单词。我怎样才能做到这一点?谢谢你的阅读。

1 个答案:

答案 0 :(得分:4)

正如您可能已经看到的那样,它保持排序的原因是因为您致电Enumerable#sort_by会将Hash更改为Array。从该方法的文档:

  

sort_by的当前实现生成一个包含原始集合元素和映射值的元组数组。

一旦你有了排序数组,你可以使用Array#first来获得前20名:

top20 = freqs.first(20)

如果需要,可以在结果上使用to_hash将其返回Hash,但不会再对其进行排序。