所以基本上我的代码如下
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"]}
基本上我不明白的是如何将“key”(显然是一个字符串)作为“eyk”的值
我一直在寻找包括文档和其他stackoverflow问题的一段时间,这是我最好的猜测
anagrams[key.downcase.chars.sort].push(key)
你的猜测:
anagrams[key.downcase.chars.sort].push(key)
是正确的。问题是您的哈希默认值:
anagrams = Hash.new([])
默认值在引用时不会自动在哈希中创建条目,它只返回值。这意味着你可以这样做:
h = Hash.new([])
h[:k].push(6)
根本没有改变h
。 h[:k]
为您提供默认值([]
),但它不会将:k
添加为关键字。另请注意,每次尝试访问不在哈希中的键时都会使用相同的默认值,因此:
h = Hash.new([])
a = h[:k].push(6)
b = h[:x].push(11)
将在[6,11]
和a
留下b
,但在h
没有任何东西。
如果你想在访问它们时自动添加默认值,你需要使用default_proc
,而不是简单的default
:
anagrams = Hash.new { |h, k] h[k] = [ ] }
这将在您访问不存在的键时创建条目,并为每个键提供不同的空数组。
你的方法应该做什么并不完全清楚,但我认为问题在于你没有一个数组来推送一个值。
在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