在Ruby中计算哈希值

14

我有一个 Ruby 中的哈希数组,看起来像这样:

domains = [
  { "country" => "Germany"},
  {"country" => "United Kingdom"},
  {"country" => "Hungary"},
  {"country" => "United States"},
  {"country" => "France"},
  {"country" => "Germany"},
  {"country" => "Slovakia"},
  {"country" => "Hungary"},
  {"country" => "United States"},
  {"country" => "Norway"},
  {"country" => "Germany"},
  {"country" => "United Kingdom"},
  {"country" => "Hungary"},
  {"country" => "United States"},
  {"country" => "Norway"}
]

我想从这个哈希数组中创建一个新的哈希,看起来像这样:

counted = {
  "Germany" => "3",
  "United Kingdom" => "United Kingdom",
  "Hungary" => "3",
  "United States" => "4",
  "France" => "1"
}

使用Ruby 1.9有没有简单的方法可以做到这一点?


3
这个哈希表出现了碰撞键。 - Kyle
6
这个哈希表的样子可能不符合你的期望。在哈希表中,一个特定的键只能对应一个值,因此你只会有一个条目(我认为保证是"country" => "Norway")。你需要一个数组类型的答案吗? - Chowlett
1
除了您的源哈希问题之外,您期望"United Kingdom" => "United Kingdom"还是"United Kingdom" => 2 - knut
3
我在Ruby中有一个哈希表,长得像这样... 不不不,其实没有! :-) - Larsenal
抱歉,我编辑了我的问题 - 它应该是哈希数组! - user1513388
2个回答

13

这个怎么样?

counted = Hash.new(0)
domains.each { |h| counted[h["country"]] += 1 }
counted = Hash[counted.map {|k,v| [k,v.to_s] }]

1
太完美了!- 你是救命恩人。我花了很长时间才能让它正常工作!!谢谢你! - user1513388
如果我有不同的键怎么办?例如 - 这是我的哈希,哈希 = { a: 5,b: 2,c: 3,d: 5 }。我想要的结果是这样的 - value_count(hash,2)=> 1和value_count(hash,5)=> 2,其中value_count(hash,value)是我的方法。 - avidCoder

6
domains.each_with_object(Hash.new{|h,k|h[k]='0'}) do |h,res|
  res[h['country']].succ!
end
=> {"Germany"=>"3",
 "United Kingdom"=>"2",
 "Hungary"=>"3",
 "United States"=>"3",
 "France"=>"1",
 "Slovakia"=>"1",
 "Norway"=>"2"}

当一个国家的实例超过9个时会发生什么? :) - Mladen Jablanović
1
谢谢,我没想到会这样。 :) 在发表评论之前我应该先阅读手册。 - Mladen Jablanović
1
不用谢,从实例中学习比从手册中学习更好。 - megas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接