2012-10-22 46 views
31

Tôi có một mảng và hàm trả về một giá trị cho một giá trị. Cuối cùng tôi muốn tạo một hashmap có các giá trị của mảng là giá trị khóa, và kết quả của f (key_value) làm giá trị. Có một cách sạch sẽ, đơn giản, giống như mỗi bản đồ của mảng, làm điều này bằng cách sử dụng khối?Ruby - ánh xạ mảng tới hashmap

Vì vậy, cái gì đó tương đương với

hsh = {} 
[1,2,3,4].each do |x| 
    hsh[x] = f(x) 
end 

nhưng trông giống như nhiều đến thế này, ở chỗ nó là đơn giản và một dòng?

results = array.map { | x | f(x) } 

Trả lời

22

Bạn cũng có thể xác định các chức năng như giá trị mặc định của băm:

hash = Hash.new {|hash, key| hash[key] = f(key) } 

Sau đó, khi bạn tra cứu một giá trị, băm sẽ tính toán và cất giữ nó khi đang bay.

hash[10] 
hash.inspect #=> { 10 => whatever_the_result_is } 
13

Bạn cần each_with_object.

def f x 
    x * 2 
end 

t = [1, 2, 3, 4].each_with_object({}) do |x, memo| 
    memo[x] = f(x) 
end 

t # => {1=>2, 2=>4, 3=>6, 4=>8} 

Một số khác:

t2 = [1, 2, 3, 4].map{|x| [x, f(x)]} 
Hash[t2] # => {1=>2, 2=>4, 3=>6, 4=>8} 
20

Kiểm tra các phương pháp Hash::[].

Hash[ [1,2,3,4].collect { |x| [x, f(x)] } ] 
+0

N ote rằng điều này không làm việc với các điều tra lười biếng, nhưng Ruby 2.1.0 '.to_h' làm. –

5

Sử dụng mash (phương pháp để chuyển đổi đếm được để băm) Các khía cạnh:

[1, 2, 3, 4].mash { |x| [x, f(x)] } 

Từ Ruby 2.1:

[1, 2, 3, 4].map { |x| [x, f(x)] }.to_h 
63

Lưu ý rằng kể từ khi của Ruby 2.1.0 bạn cũng có thể sử dụng Array#to_h , như sau:

[1,2,3,4].map{ |x| [x, f(x)] }.to_h 
+1

Mảng # to_h không có trong Ruby 2.0.0, nhưng hiện diện trong Ruby 2.1.0. Tôi đã gửi bản chỉnh sửa để phản ánh điều này (cùng với một vài ký tự thay đổi khác, vì giới hạn độ dài chỉnh sửa tối thiểu). –

Các vấn đề liên quan