2011-03-06 102 views
1

我有一个散列数组。每个散列都有一个uses密钥。多个哈希值可以共享相同的uses值。如何计算哈希数组中特定键的值的频率?

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

怎样才能最频繁的uses值的数组,以降序?

[1,0,2,3] 

回答

2

参考this discussion of frequency of items in a list,我们可以很容易地修改你的任务。

> 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] 
+0

)的小输入,但算法看起来非常无效ENT。而我的理解是,输入只是一个例子,哈希值有更多的信息(所以'uniq'不会这样做) – tokland 2011-03-06 18:39:56

+0

我同意一个更有趣的问题是,“这样做的最有效方法是什么? “ – jdl 2011-03-06 19:38:33

0

这里是一个合格的解决方案:

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]} 
1
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] 

我总是建议使用构面,虽然:OK(被如此紧凑

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

+1面。我以前没有看过那个项目。 – jdl 2011-03-06 19:39:18