2010-08-31 89 views
0

我在Ruby中有一個散列,它存儲了一個字符串的單詞頻率,單詞作爲鍵,頻率作爲值。如何根據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個最常見的單詞。我怎樣才能做到這一點?謝謝閱讀。

回答

3

正如您可能已經看到的,它保持排序的原因是因爲您致電Enumerable#sort_by將您的Hash更改爲Array。從該方法的文檔:

sort_by的當前實現將生成一個包含原始集合元素和映射值的元組數組。

一旦你有你的數組排序,你可以只使用Array#first獲得前20名:

top20 = freqs.first(20) 

如果你願意,你可以使用to_hash的結果要返回到一個Hash,但它不會被排序。

+0

啊,這是有道理的。謝謝你的幫助。 – ben 2010-08-31 01:44:50