2013-11-01 79 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"} 
相關問題