2013-09-27 363 views
7

我有一個散列,其中鍵是一個字符串,值是一個字符串的數組。 我想是這樣的:紅寶石數組哈希

{"k1"=>["v1", "v2"], "k2"=>["v3", "v4"]} 

我只有一個哈希和一個陣列來實現這一點。我已經編寫這樣的事情:

hash1 = Hash.new 
arr = Array.new 
arr.push "v1" 
arr.push "v2" 
hash1["k1"] = arr 

#hash is like this: {"k1"=>["v1", "v2"] 
#Now I clear the array to read the new values 

arr. clear 
arr.push "v3" 
arr.push "v4" 
hash1["k2"] = arr 
puts hash1 

#Output: {"k1"=>["v3", "v4"], "k2"=>["v3", "v4"]} 
#Notice that k1's value also got updated 

然後,我改變了一行:

hash1 = Hash.new 
arr = Array.new 
arr.push "v1" 
arr.push "v2" 
hash1["k1"] = arr 

arr = [] # ** This is the only changed line. Now k1's value is correct. ** 
arr.push "v3" 
arr.push "v4" 
hash1["k2"] = arr 
puts hash1 
#Output: {"k1"=>["v1", "v2"], "k2"=>["v3", "v4"]} (which I wanted) 

是否有人可以解釋我這樣做是如何發生的?我對Ruby很新。理想情況下,解決這個問題的正確方法是什麼?

+2

「我只有一​​個散列和一個數組來執行此操作。不在你的第二個例子中。你有兩個數組。 – Ajedi32

+2

'{}'幾乎總是比'Hash.new'更好,'[]'更好''Array.new'。 – tadman

+0

@tadman爲什麼更好?這僅僅是爲了可讀性嗎?還是還有其他好處? –

回答

8

這應該告訴你發生了什麼(object_id是你的朋友)。 (我在Object_id中插入了一個下劃線,以便更容易看出區別。)

hash1 = {}   # => {} 
arr = ["v1", "v2"] # => ["v1", "v2"] 
arr.object_id   # => 7016637_4343580 
hash1["k1"] = arr  # => ["v1", "v2"] 
hash1     # => {"k1"=>["v1", "v2"]} 
hash1["k1"].object_id # => 7016637_4343580 
arr.clear    # => [] 
arr.object_id   # => 7016637_4343580 
arr << "v3" << "v4" # => ["v3", "v4"] 
arr.object_id   # => 7016637_4343580 
hash1["k2"] = arr  # => ["v3", "v4"] 
hash1     # => {"k1"=>["v3", "v4"], "k2"=>["v3", "v4"]} 
hash1["k1"].object_id # => 7016637_4343580 
hash1["k2"].object_id # => 7016637_4166580 

arr = []    # => [] 
arr.object_id   # => 7016637_4036500 
arr = ["v5", "v6"] # => ["v5", "v6"] 
arr.object_id   # => 7016637_3989880 
hash1     # => {"k1"=>["v3", "v4"], "k2"=>["v3", "v4"]} 
hash1["k1"].object_id # => 7016637_4343580 
hash1["k2"] = arr  # => ["v5", "v6"] 
hash1     # => {"k1"=>["v3", "v4"], "k2"=>["v5", "v6"]} 
hash1["k1"].object_id # => 7016637_4343580 
hash1["k2"].object_id # => 7016637_3989880 
+0

很好的解釋。 如果我想排序我的哈希價值v1或v2我該怎麼辦? 'hash1.sort_by {| k,v | v.first}'#undefined method'[]'爲零:NilClass 'hash1.sort_by {| k,v | v [0]}'#undefined method'[]'爲零:NilClass – Aparichith

+0

我不太明白你的問題。請用'hash1'的例子留下另一條評論,並且希望散列的結果是什麼。 –

+0

考慮如下的哈希陣列 {[「a」=> [576,236]}, {「z」=> [348,4859]}, {「b」=> [174,98] }, {「t」=> [165,145]}, {「u」=> [97,184]}, {「m」=> [595,374] > [61,86]}]' 我應該如何使用每個鍵的值總和對我的散列數組進行排序? 這樣 '[{ 「Z」=> [348,4859]}, { 「一個」=> [576,236]}, {的 「m」=> [595,374]}, {「t」=> [165,145]}, {「u」=> [97,184]}, {「b」=> [174,98]}, {「g」=> [61 ,86]}]' – Aparichith

3

您保存在散列表中的數組仍然以arr爲參考,因此很清楚地使用arr.clear並使用arr.push會清除並向保存在散列表中的值添加新值。但是現在做arr = [],arr現在會引用一個新的數組,它與散列中保存的不同。

而且你可以簡單地添加新的數組與哈希:

hash1["k2"] = ["v3", "v4"] 

或者

hash1["k2"] = %w[v3 v4] 
+2

添加到答案中,您可以看到它的工作原理,在您的'arr','arr.object_id'上執行此操作,您將收到一個數字,當您使用'clear'並再次檢查id時,它是一樣的同樣的參考文獻),當你arr = []'你創建一個同名的新對象時,覆蓋舊的對象,用'arr.object_id'檢查它,你將得到一個不同的id號,這意味着一個新的對象:) – Gerep