2012-10-22 26 views
31

Ich habe ein Array und eine Funktion, die einen Wert mit einem Wert zurückgibt. Letztendlich möchte ich eine Hashmap erstellen, die die Werte des Arrays als Schlüsselwert und das Ergebnis von f (Schlüsselwert) als Wert hat. Gibt es einen sauberen, einfachen Weg, ähnlich wie bei jeder/map of Array, dies mit block zu tun?Ruby - Zuordnung eines Arrays zu hashmap

So etwas, das zu

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

entspricht aber sieht dies ähnlich, dass es einfach ist und eine Linie?

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

Antwort

22

Sie können auch die Funktion als den Standardwert des Hash definieren.

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

Sie benötigen 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} 

Ein anderes:

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

Schauen Sie sich die Hash::[] Methode.

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

Dann, wenn Sie einen Wert nachzuschlagen, wird der Hash berechnet und speichert sie im Fluge:

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

N Beachten Sie, dass dies nicht mit Lazy-Enumeratoren funktioniert, aber ".to_h" von Ruby 2.1.0 funktioniert. –

5

Mit Facets' mash (Methode Hashes zu konvertieren zählbare):

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

von Ruby 2.1:

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

Beachten Sie, dass seit dem Ruby-2.1.0 Sie auch Array#to_h verwenden können , so:

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

Array # to_h ist in Ruby 2.0.0 nicht vorhanden, aber in Ruby 2.1.0 vorhanden. Ich habe eine Änderung eingereicht, um dies widerzuspiegeln (zusammen mit ein paar anderen geänderten Zeichen, wegen der minimalen Bearbeitungslänge Einschränkung). –

Verwandte Themen