2012-02-24 29 views
19

我有一个字符串数组,并希望做一个哈希出来。数组中的每个元素都是关键字,我希望从该关键字开始计算值。有没有Ruby的方式来做到这一点?红宝石数组哈希:每个元素的关键和派生值从它

例如:

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

+0

字符串是否是唯一的?如果他们不是?你想要例外吗? – 2012-02-24 16:15:24

+0

是的,他们将是唯一的。如果他们不是,我会在那之前做一个uniq。 – lulalala 2012-02-24 16:19:28

回答

49

您可以:

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

这当然有效......但我不认为它是*最*高效的......在这种情况下,你迭代了两次。当然不是一个长度为2的数组,但仍然值得注意。 – brad 2012-02-24 16:37:55

4

这里有一个天真和简单的解决方案是将电流转换角色,以一个符号被用作键。只是为了好玩,它将资本化的价值。 :)

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

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

不知道这是否是真正的Ruby的方式,但应该是足够接近:

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

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

作为一个功能,我们将有这样的:

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

而且,任何方式你看看它,你将需要迭代初始数组。这里的另一种方式:

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

我喜欢你的解决方案!很光滑! – 2012-02-25 17:38:21

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 }