2011-10-24 23 views
8

Değerlerin, orijinal hash'ta bir değer olarak kaç kez göründüğünün bir sayısını içeren yeni bir Hash'daki değerleri anahtar olarak kullanmak istediğim bir hash'ım var.hashes için Ruby "say" yöntemi

hashA.keys.each do |i| 
    puts hashA[i] 
end 

Örnek çıktı:

0 
1 
1 
2 
0 
1 
1 

Ve yeni Hash şu olmak istiyorum:

yüzden kullanmak

{ 0 => 2, 1 => 4, 2 => 1 } 
+0

[Bir Ruby dizisinde özdeş dize öğeleri nasıl sayılır] 'ın olası kopyası (http://stackoverflow.com/questions/5128200/how-to-count-identical-string-elements-in-a-ruby -dizi). Bu sorudaki orijinal veri yapısı bir karmadır, ancak anahtarları atıyorsunuz, yani bir dizi olan hashA.values ​​ile etkili bir şekilde uğraşıyorsunuz. –

+0

@AndrewGrimm Meh; nihayetinde (ve hızlıca), evet ... Ama bir "haritam var" zihniyetiyle arama yaparken, muhtemelen diziler hakkında bir şeyler aramayacaksınız. Blokta anlamlı değişken isimler için –

cevap

17
counts = hashA.values.inject(Hash.new(0)) do |collection, value| 
    collection[value] +=1 
    collection 
end 
+5

+1; API'yi bilmediğin zamanlar, unuttum. –

7

TL; DR: hashA.values.inject(Hash.new(0)) { |m, n| m[n] += 1; m }

> hashA = { a: 0, b: 1, c: 1, d: 2, e: 0, f: 1, g: 1 } 
=> {:a=>0, :b=>1, :c=>1, :d=>2, :e=>0, :f=>1, :g=>1} 
> hashCounts = hashA.values.inject(Hash.new(0)) { |m, n| m[n] += 1; m } 
=> {0=>2, 1=>4, 2=>1} 
İlgili konular