2014-03-07 27 views
0

嗨如何計算紅寶石基於一些值的哈希數組?如何計算基於紅寶石的一些值的散列數組?

例如:

gundams = [{:type=>"perfect grade", :name=>"00 raiser gundam 1/60"}, {:type=>"perfect grade", :name=>"strike freedom gundam 1/60"}, {:type=>"perfect grade", :name=>"astray red flame gundam 1/60"}, {:type=>"master grade", :name=>"exia gundam 1/100"}, {:type=>"master grade", :name=>"wing zero costum 1/100"}] 

如何計算基於散列類型數組?我希望得到結果是這樣的:

回答

2

{"perfect grade"=>3, "master grade"=>2} 

感謝使用Enumerable#group_by

gundams = [ 
    {:type=>"perfect grade", :name=>"00 raiser gundam 1/60"}, 
    {:type=>"perfect grade", :name=>"strike freedom gundam 1/60"}, 
    {:type=>"perfect grade", :name=>"astray red flame gundam 1/60"}, 
    {:type=>"master grade", :name=>"exia gundam 1/100"}, 
    {:type=>"master grade", :name=>"wing zero costum 1/100"} 
] 
Hash[gundams.group_by {|g| g[:type]}.map { 
    |type, gs| [type, gs.size] 
}] 
# => {"perfect grade"=>3, "master grade"=>2} 
+0

解決該問題的我的意思是導致這樣{ 「完美級」=> 3, 「主級」=> 2},遺憾沒有添加字符串。 謝謝你的回答,已經對:) – tardjo

+0

@tardjo,我明白了。我根據問題編輯更新了答案。 – falsetru

+0

hi @falsetru如何將結果轉換爲[3,2]? – tardjo

0

像這樣的事情?

gundams = [{:type=>"perfect grade", :name=>"00 raiser gundam 1/60"}, {:type=>"perfect grade", :name=>"strike freedom gundam 1/60"}, {:type=>"perfect grade", :name=>"astray red flame gundam 1/60"}, {:type=>"master grade", :name=>"exia gundam 1/100"}, {:type=>"master grade", :name=>"wing zero costum 1/100"}] 

# Create a hash with a 0 as default value 
total = Hash.new(0) 

# Iterate on each value and increment for its type 
gundams.each { |value| total[value[:type]] += 1 } 

p total 
# => {"perfect grade"=>3, "master grade"=>2} 
+0

謝謝@Martin – tardjo

+0

hi @Martin如何將結果轉換爲像這樣的數組[3,2]? – tardjo

1

至於建議的@falsetru(誰是快),使用Enumerable#group_by

gundams.group_by { |e| e[:type] }.map { |k,v| [k, v.length] } 
=> [["perfect grade", 3], ["master grade", 2]] 

然後,您可以打印上面,你想數組。

+0

使用'each_with_object'來獲得最終的散列而不是'Hash [..]'.. –

0

不同的方法來與Enumerable#each_with_object

gundams.each_with_object(Hash.new(0)) { |x,hash| hash[x[:type]] += 1 } 
#=> {"perfect grade"=>3, "master grade"=>2}