2012-10-22 84 views
31

我有一个数组,并有一个函数返回给定值的值。最终,我想创建一个hashmap,其中的数组值为key值,f(key_value)的值作为值。有没有一种干净,简单的方法,就像使用数组块的每个/ Array数组映射一样?Ruby - 将数组映射到散列图

这样的东西,就相当于

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

但看起来更多类似的,因为它的简单和一条线?

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

回答

22

你也可以定义函数作为哈希的默认值:

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

然后,当你查找一个值,该散列计算将其存储的飞行。

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

您需要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} 

还有一句:

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

退房的Hash::[]方法。

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

N注意这不适用于惰性枚举器,但是Ruby 2.1.0的'.to_h'确实可以。 –

5

使用刻面mash(方法枚举转换成散列):

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

红宝石2.1:

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

注意,因为红宝石2.1.0,你也可以使用Array#to_h ,像这样:

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

Array#to_h在Ruby 2.0.0中不存在,但存在于Ruby 2.1.0中。我提交了一个编辑来反映这一点(以及其他一些更改的字符,因为编辑长度限制最小)。 –