2012-04-06 143 views
2

我正在尋找執行從字符串到整數的紅寶石散列值的轉換。如何在Ruby中將字符串的值從字符串轉換爲數組?

我認爲這與您在Ruby數組中執行轉換的方式(使用map方法)非常相似,但我一直無法找到一個不涉及將散列轉換爲數組,扁平化等等。

有沒有乾淨的解決方案來做到這一點?

EG。從

x = { "a" => "1", "b" => "2", "c"=> "3" } 

x = { "a" => 1, "b" => 2, "c" => 3 } 

回答

3

我首選的方案:

Hash[x.map { |k, v| [k, v.to_i]}] #=> {"a"=>1, "b"=>2, "c"=>3} 

一個有點浪費一個(具有遍歷值的兩倍):

Hash[x.keys.zip(x.values.map(&:to_i))] #=> {"a"=>1, "b"=>2, "c"=>3} 
+0

謝謝!這個解決方案看起來就像我會用的那個。我認爲會有一些使用地圖功能的東西。 – Ken 2012-04-06 17:04:26

+0

注意,這個答案創建了一箇中間數組('Enumerable#map'總是返回一個'Array'),所以對於大哈希,最好使用我的解決方案。 – sluukkonen 2012-04-17 12:24:35

0
p.keys.map { |key| p[key] = p[key].to_i } 
+1

這不起作用。塊參數位置不正確,'Array'或'Enumerable'都沒有一個名爲'to_map'的方法。 – sluukkonen 2012-04-06 07:16:00

+0

'p.keys.map {| key | p [key] = p [key] .to_i}'是你的意思。 – 2012-04-06 07:19:23

+0

to_map是我的自定義方法..只是忘了那..謝謝糾正 – 2012-04-06 07:21:04

2

試試這個:

x.each{|k,v| x[k]=v.to_i} 
4

爲了避免修改原始哈希(不同於現有的答案),我會使用

newhash = x.reduce({}) do |h, (k, v)| 
    h[k] = v.to_i and h 
end 

如果您使用的是Ruby 1.9,您還可以使用Enumerable#each_with_object來更加乾淨地實現相同的效果。

newhash = x.each_with_object({}) do |(k, v), h| 
    h[k] = v.to_i 
end 

如果你願意,你也可以提取邏輯放到一個模塊,它擴展了Hash類。

module HMap 
    def hmap 
    self.each_with_object({}) do |(k, v), h| 
     h[k] = yield(k, v) 
    end 
    end 
end 

class Hash 
    include HMap 
end 

現在你可以使用

newhash = x.hmap { |k, v| v.to_i } # => {"a"=>1, "b"=>2, "c"=>3} 
+0

很好的徹底的答案,非常詳細。 – joelparkerhenderson 2012-04-06 07:46:03

相關問題