2011-10-24 25 views
8

Tôi có một hàm băm trong đó tôi muốn sử dụng các giá trị như các khóa trong một Hash mới có chứa số lần mục đó xuất hiện dưới dạng giá trị trong băm gốc.Phương pháp "đếm" Ruby cho băm

Vì vậy, tôi sử dụng:

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

đầu ra Ví dụ:

0 
1 
1 
2 
0 
1 
1 

Và tôi muốn các Hash mới được như sau:

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

có thể trùng lặp của [Cách đếm các phần tử chuỗi giống hệt nhau trong một mảng Ruby] (http://stackoverflow.com/questions/5128200/how-to-count-identical-string-elements-in-a-ruby -mảng). Cấu trúc dữ liệu gốc trong câu hỏi này là một băm, nhưng bạn đang vứt bỏ các khóa, vì vậy bạn đang giao dịch hiệu quả với 'hashA.values', là một mảng. –

+0

@AndrewGrimm Meh; cuối cùng (và nhanh chóng), vâng ... Nhưng khi tìm kiếm với tư duy "Tôi có một bản đồ", bạn có thể sẽ không tìm kiếm nội dung về mảng. –

Trả lời

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

+1 cho các tên biến có ý nghĩa trong khối; Tôi quên khi bạn không biết API, họ quan trọng. –

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} 
Các vấn đề liên quan