2012-10-22 85 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中。我提交了一個編輯來反映這一點(以及其他一些更改的字符,因爲編輯長度限制最小)。 –