2012-02-24 6 views
19

私は文字列の配列を持っていて、そこからハッシュを作りたい。配列の各要素がキーになり、そのキーから計算される値にしたいと思います。これを行うRubyの方法はありますか?例えばRuby配列をハッシュする:各要素のキーとそれから値を派生させる

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

+0

文字列は一意ですか?もしそうでないなら、どうしますか?例外が欲しいですか? –

+0

はい、それらは一意になります。もしそうでなければ、私はその前にuniqをするでしょう。 – lulalala

答えて

49

次のことができます。

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

これは確かに動作します...しかし、私はそれが* most *効率的だとは思わない...あなたはこの場合2回反復しています。もちろん、長さ2の配列には関心がありませんが、注意する価値はあります。 – brad

4

に変換するためにここでキーとして使用するシンボルに現在の文字を変換素朴でシンプルなソリューションです。そしてちょうど楽しみのためにそれは価値を大文字にします。あなたは

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"} 
1

わかりませんそれを見て、最初の配列を反復する必要があります。ここでは別の方法です:

a = ['a', 'b', 'c'] 
h = Hash[a.collect {|v| [v, v.upcase]}] 
#=> {"a"=>"A", "b"=>"B", "c"=>"C"} 
3

どちらこれまでの方法:

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

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

機能として、我々はこれを持っているでしょう:これは本当のRubyの方法ですが、十分に近いはずである場合:)

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

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

私はあなたのソリューションが好きです!非常に滑らか! –

0

ここでは別の方法です:

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

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

Rubyのeach_with_object方法は、あなたが

欲しいものを行うためのきちんとした方法であります
['a', 'b'].each_with_object({}) { |k, h| h[k] = k.upcase } 
関連する問題