Как разделить хэш на основе значений в Ruby? - PullRequest
1 голос
/ 31 августа 2010

У меня есть хеш в 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 Ответ

4 голосов
/ 31 августа 2010

Как вы, вероятно, видели, причина, по которой он остается отсортированным, заключается в том, что ваш звонок на Enumerable#sort_by превращает ваш Hash в Array.Из документации для этого метода:

Текущая реализация sort_by генерирует массив кортежей, содержащий исходный элемент коллекции и сопоставленное значение.

После того, как вы отсортировалимассив, вы можете просто использовать Array#first, чтобы получить верхние 20:

top20 = freqs.first(20)

Если хотите, вы можете использовать to_hash в результате, чтобы вернуть его обратно к Hash, но он больше не будет сортироваться.

...