2015-04-07 44 views
0

所以基本上我的代碼如下如何將一個對象添加到數組中,其中該數組是一個哈希鍵中的值?

anagrams = Hash.new([]) 
self.downcase.scan(/\b[a-z]+/i).each do |key| 
    anagrams[key.downcase.chars.sort] = #push key into array 
end 

所以基本上哈希是這樣的

anagrams = { "abcdef" => ["fdebca", "edfcba"], "jklm" => ["jkl"]} 

基本上我不明白的是如何把「鑰匙」(這顯然是一個串)作爲價值「的Eyk」

我一直在尋找了一段時間,包括文件和其他stackflow的問題,這是我最好的猜測

anagrams[key.downcase.chars.sort].push(key) 
+0

如果你寫了,「所以基本上我一直在尋找......」,我會尖叫一番。 –

+0

直到你指出它,我才注意到我對這個詞的高度使用。堆棧溢出,識別您的方法和語音中的問題。 – user2259723

回答

0

這並不完全清楚你的方法應該做什麼,但我認爲問題是你沒有一個數組來推送一個值。

在Ruby中,您可以將代碼塊傳遞給Hash.new,告訴它在嘗試訪問不存在的密鑰時該怎麼做。這是自動將值初始化爲空數組的方便方法。例如:

hsh = Hash.new {|hsh, key| hsh[key] = [] } 
hsh[:foo] << "bar" 
p hsh # => { :foo => [ "bar" ] } 

在你的方法(我假設你增加了String類),你會使用這樣的:

class String 
    def my_method 
    anagrams = Hash.new {|hsh, key| hsh[key] = [] } 

    downcase.scan(/\b[a-z]+/i).each_with_object(anagrams) do |key| 
     anagrams[key.downcase.chars.sort.join] << key 
    end 
    end 
end 
+0

啊,是的,你完全正確的默認值!我實際上是將該方法添加到包含在String類中的模塊中。另外,注意到你爲我添加了連接方法。直到我看到我的控制檯,才意識到我錯過了它!感謝你的啓示。 – user2259723

1

你的猜測:

anagrams[key.downcase.chars.sort].push(key) 

是對的。問題是你的哈希的默認值:

anagrams = Hash.new([]) 

的默認值不會自動創建,當你引用它的哈希一個條目,它只是返回的值。這意味着你可以這樣做:

h = Hash.new([]) 
h[:k].push(6) 

根本沒有改變hh[:k]爲您提供默認值([]),但不會將:k作爲關鍵字添加。還要注意的是相同的默認值是用來每次嘗試訪問的一個關鍵,是不是在哈希所以這個時候:

h = Hash.new([]) 
a = h[:k].push(6) 
b = h[:x].push(11) 

你會留下[6,11]兩個ab,但沒有在h

如果您希望在訪問這些自動添加默認值,你需要使用一個default_proc,不是一個簡單的default

anagrams = Hash.new { |h, k] h[k] = [ ] } 

,當你訪問一個不存在的鍵,將創建條目並給每一個不同的空陣列。

相關問題