Как определить частоту значения определенного ключа в массиве хэшей? - PullRequest
1 голос
/ 06 марта 2011

У меня есть массив хэшей.Каждый хэш имеет ключ uses.Несколько хэшей могут иметь одно и то же значение uses.

[{uses => 0},{uses => 1},{uses => 2},{uses => 1},{uses => 0},{uses => 1},{uses => 3}]

Как создать массив наиболее частых значений uses в порядке убывания?

[1,0,2,3]

Ответы [ 3 ]

2 голосов
/ 06 марта 2011

Ссылки это обсуждение частоты элементов в списке , мы можем легко изменить это для вашей задачи.

> unsorted = [{:uses=>0}, {:uses=>1}, {:uses=>2}, {:uses=>1}, {:uses=>0}, {:uses=>1}, {:uses=>3}].map{|h| h[:uses]}
> sorted = unsorted.uniq.sort_by{|u| unsorted.grep(u).size}.reverse
 => [1, 0, 2, 3] 
1 голос
/ 06 марта 2011
hs.inject({}) do |histogram, h|
  histogram.merge(h[:uses] => (histogram[h[:uses]] || 0) + 1)
end.sort_by { |k, v| -v }.map { |k, v| k }
# => [1, 0, 2, 3]

Я всегда рекомендую использовать Facets, хотя:

http://rubyworks.github.com/facets/doc/api/core/Enumerable.html

hs.frequency.sort_by { |k, v| -v }.map { |k, v| k }
# => [1, 0, 2, 3]
0 голосов
/ 06 марта 2011

Вот решение за один проход:

a = [{:uses => 0},{:uses => 1},{:uses => 2},{:uses => 1},{:uses => 0},
  {:uses => 1},{:uses => 3}]

# A hash with the frequency count is formed in one iteration of the array
# followed by the reverse sort and extraction

a.inject(Hash.new(0)) { |h, v| h[v[:uses]] += 1;h}.
  sort{|x, y| x <=> y}.map{|kv| kv[0]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...