2012-10-22 15 views
31

Ho una matrice e una funzione che restituisce un valore dato un valore. In definitiva, voglio creare una hashmap che abbia i valori dell'array come valore chiave e il risultato di f (valore_chiave) come valore. Esiste un modo semplice e pulito, simile a ciascuna/mappa di Array, di fare questo usando il blocco?Ruby - mappatura di una matrice in hashmap

Quindi, qualcosa che è equivalente a

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

ma sembra più simile a questo, in quanto è semplice e una linea?

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

risposta

22

Si potrebbe anche definire la funzione come valore di default del hash:

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

Poi, quando si ricerca un valore, l'hash calcolerà e memorizzare al volo.

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

È necessario 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} 

Un altro:

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

Partenza il metodo Hash::[].

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

N questo non funziona con gli enumeratori pigri, ma con '.to_h' di Ruby 2.1.0. –

5

Utilizzando mash (metodo per convertire enumerabile di hash) Sfaccettature:

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

da Ruby 2.1:

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

Nota che, dal momento di Ruby 2.1.0 è anche possibile utilizzare Array#to_h , come questo:

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

L'array # to_h non è presente in Ruby 2.0.0, ma è presente in Ruby 2.1.0. Ho inviato una modifica per riflettere questo (insieme ad un altro paio di caratteri modificati, a causa della limitazione minima della lunghezza di modifica). –

Problemi correlati