2012-02-24 9 views
19

Ho una matrice di stringhe e voglio fare un hash da esso. Ogni elemento dell'array sarà la chiave e voglio rendere il valore calcolato da quella chiave. C'è un modo Ruby per farlo?Ruby array to hash: ogni elemento la chiave e ne ricava il valore

Ad esempio:

['a','b'] per convertire a {'a'=>'A','b'=>'B'}

+0

Le stringhe sono univoche? Cosa succede se non lo sono? Vuoi un'eccezione? –

+0

sì, saranno unici. Se non lo sono, farei un uniq prima di quello. – lulalala

risposta

49

È possibile:

a = ['a', 'b'] 
Hash[a.map {|v| [v,v.upcase]}] 
+4

funziona sicuramente ... ma non penso che sia il * più * efficiente ... stai ripetendo due volte in questo caso. Ovviamente non è un problema con una serie di lunghezza 2, ma vale comunque la pena di essere notato. – brad

4

Ecco una soluzione ingenua e semplice che converte il carattere corrente ad un simbolo da utilizzare come chiave. E solo per divertimento, capitalizza il valore. :)

h = Hash.new 
['a', 'b'].each {|a| h[a.to_sym] = a.upcase} 
puts h 

# => {:a=>"A", :b=>"B"} 
1

Non so se questo è il vero modo di Ruby, ma dovrebbe essere abbastanza vicino:

hash = {} 
['a', 'b'].each do |x| 
    hash[x] = x.upcase 
end 

p hash # prints {"a"=>"A", "b"=>"B"} 

In funzione avremmo questo:

def theFunk(array) 
    hash = {} 
    array.each do |x| 
    hash[x] = x.upcase 
    end 
    hash 
end 


p theFunk ['a', 'b', 'c'] # prints {"a"=>"A", "b"=>"B", "c"=>"C"} 
3

In qualunque modo si guardatelo avrete bisogno di iterare la matrice iniziale. Ecco un altro modo:

a = ['a', 'b', 'c'] 
h = Hash[a.collect {|v| [v, v.upcase]}] 
#=> {"a"=>"A", "b"=>"B", "c"=>"C"} 
21
%w{a b c}.reduce({}){|a,v| a[v] = v.upcase; a} 
+0

Mi piace la tua soluzione! Molto lucido! –

0

Ecco un altro modo:

a.zip(a.map(&:upcase)).to_h 

#=>{"a"=>"A", "b"=>"B"} 
1

metodo di Ruby each_with_object è un modo pulito di fare ciò che si vuole

['a', 'b'].each_with_object({}) { |k, h| h[k] = k.upcase } 
Problemi correlati