我有一個字符串數組,並希望做一個哈希出來。數組中的每個元素都是關鍵字,我希望從該關鍵字開始計算值。有沒有Ruby的方式來做到這一點?紅寶石數組哈希:每個元素的關鍵和派生值從它
例如:
['a','b']
轉換爲{'a'=>'A','b'=>'B'}
我有一個字符串數組,並希望做一個哈希出來。數組中的每個元素都是關鍵字,我希望從該關鍵字開始計算值。有沒有Ruby的方式來做到這一點?紅寶石數組哈希:每個元素的關鍵和派生值從它
例如:
['a','b']
轉換爲{'a'=>'A','b'=>'B'}
您可以:
a = ['a', 'b']
Hash[a.map {|v| [v,v.upcase]}]
這當然有效......但我不認爲它是*最*高效的......在這種情況下,你迭代了兩次。當然不是一個長度爲2的數組,但仍然值得注意。 – brad 2012-02-24 16:37:55
這裏有一個天真和簡單的解決方案是將電流轉換角色,以一個符號被用作鍵。只是爲了好玩,它將資本化的價值。 :)
h = Hash.new
['a', 'b'].each {|a| h[a.to_sym] = a.upcase}
puts h
# => {:a=>"A", :b=>"B"}
不知道這是否是真正的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"}
而且,任何方式你看看它,你將需要迭代初始數組。這裏的另一種方式:
a = ['a', 'b', 'c']
h = Hash[a.collect {|v| [v, v.upcase]}]
#=> {"a"=>"A", "b"=>"B", "c"=>"C"}
%w{a b c}.reduce({}){|a,v| a[v] = v.upcase; a}
我喜歡你的解決方案!很光滑! – 2012-02-25 17:38:21
這裏的另一種方式:
a.zip(a.map(&:upcase)).to_h
#=>{"a"=>"A", "b"=>"B"}
Ruby的each_with_object
方法是做你想要什麼的一種巧妙的方法
['a', 'b'].each_with_object({}) { |k, h| h[k] = k.upcase }
字符串是否是唯一的?如果他們不是?你想要例外嗎? – 2012-02-24 16:15:24
是的,他們將是唯一的。如果他們不是,我會在那之前做一個uniq。 – lulalala 2012-02-24 16:19:28