2013-11-01 46 views
4

如何将几个值添加到同一个密钥?这样的事情:如何将多个值添加到相同的密钥

x = {} 
x["k1"] = nil 
x["k1"] << {"a" => "a"} 
x["k1"] << {"b" => "b"} 

好吧,这不工作像数组。

+1

你的问题没有意义。你真的需要修复它。你的意思是'x [“k1”] = {}'或'= []'?无论如何,以下两条陈述令人费解。包含一个小例子通常很有帮助,可以显示给定输入的输出结果。如果你这样做,我们可以帮助你正确地陈述问题(这将对你有教育意义)。 –

+0

如果您将多值键值对视为仅仅是一组键 - 值对的键,那么您可以想象如何实现您寻找的典型现代映射类型散列符号。代替'{:key => value1,value2}',请考虑'{:key => [{:subkey_1 => value_1},{:subkey_2 => value_2}]} - 这就是您可以在Ruby中执行的操作,至少。 –

回答

13

您可以如下操作:

对于Array作为价值的Hash的关键:

h = Hash.new{|hsh,key| hsh[key] = [] } 
h['k1'].push 'a' 
h['k1'].push 'b' 
p h # >> {"k1"=>["a", "b"]} 

对于Hash作为值的关键一个Hash

h = Hash.new{|hsh,key| hsh[key] = {} } 
h['k1'].store 'a',1 
h['k1'].store 'b',1 
p h # >> {"k1"=>{"a"=>1, "b"=>1}} 
+0

推荐此代码,更简单'h ['k1'] <<'a'<<'b'' –

5

取决于你在这里完成的任务。如果你想要一个数组哈希表,这是很容易:

x = {} 
x['k1'] = Array.new 
x['k1'] << 'a' 
x['k1'] << 'b' 

,或者如果你想嵌套的哈希值,很简单也

x = {} 
x['k1'] = {} 
x['k1']['a'] = 'a' 
x['k1']['b'] = 'b' 

在哈希值都只是对象。它们可以是数组,其他哈希,或其他任何你可能想要的。

2

所以,你希望key'k1'的值是一个散列,并且你希望将key/value对添加到那个散列。你可以这样说:

2.0.0-p195 :111 > x = {} 
=> {} 
2.0.0-p195 :112 > x['k1'] = { 'a' => '1' } 
=> {"a"=>"1"} 
2.0.0-p195 :117 > x['k1'].merge!({ 'b' => '2' }) 
=> {"a"=>"1", "b"=>"2"} 

或者,你可以做这样的:

2.0.0-p195 :119 > x['k1']['c'] = 3 
=> 3 
2.0.0-p195 :120 > x['k1'] 
=> {"a"=>"1", "b"=>"2", "c"=>3} 
0

简短的回答是,你不能:散列关键字只有一个定义值。 另外,您正尝试使用铲运算符<<(一种数组方法)来设置值。但是,即使你使用=,每次你设置键为新值时,旧值丢失:

x = {} 
=> {} 
x["k1"] = {"a" => "a"} 
=> {"a"=>"a"} 
x["k1"] = {"b" => "b"} 
=> {"b"=>"b"} 

正如其他人所指出的那样,如果你想每个键“几个值”,你应该使用某种集合

x = {} 
=> {} 
x["k1"] = {"a" => "a", "b" => "b"} 
=> {"a"=>"a", "b"=>"b"} 
相关问题