webentwicklung-frage-antwort-db.com.de

Ruby - Zuordnung eines Arrays zu Hashmap

Ich habe ein Array und eine Funktion, die einen bestimmten Wert zurückgibt. Letztendlich möchte ich eine Hashmap erstellen, die die Werte des Arrays als Schlüsselwert und das Ergebnis von f (key_value) als Wert enthält. Gibt es einen sauberen, einfachen Weg, wie in jeder/Karte von Array, dies mit Hilfe eines Blocks zu tun? 

Also etwas, das äquivalent ist

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

sieht aber eher so aus, dass es einfach ist und eine Zeile? 

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

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

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

Wenn Sie nach einem Wert suchen, berechnet und speichert der Hash ihn im laufenden Betrieb.

hash[10]
hash.inspect #=> { 10 => whatever_the_result_is }
27
Zach Kemp

Beachten Sie, dass Sie seit Ruby 2.1.0 auch Array # to_h verwenden können, wie folgt:

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

Schauen Sie sich die Hash :: [] -Methode an.

Hash[ [1,2,3,4].collect { |x| [x, f(x)] } ]
21
Matt Huggins

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}

Noch einer:

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

Verwenden von Facets ' mash (Methode zum Konvertieren von Aufzählungszeichen in Hashes):

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

Ab Ruby 2.1:

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

Ruby 2.6.0 aktiviert das Übergeben eines Blocks an die to_h- Methode . Dies ermöglicht eine noch kürzere Syntax zum Erstellen eines Hash aus einem Array:

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

Sie suchen nach der reduce()|inject() Methode :

elem = [1,2,3,4]
h = elem.reduce({}) do |res, x|
  res[x] = x**2
  res
end

puts h

Das an reduce({}) übergebene Argument ist der Anfangswert eines Zwischenobjekts, das als res-Variable an den Block übergeben wird. In jeder Iteration fügen wir dem res-Hash ein neues Paar key: value hinzu und nehmen den Hash für die nächste Iteration zurück. 

Die obige Methode berechnet einen sehr praktischen Hash von Quadratwerten:

{1=>1, 2=>4, 3=>9, 4=>16}
0
Tombart