基本上我的代码如下
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 :(得分:1)
你的猜测:
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] = [ ] }
当您访问不存在的密钥并为每个密钥分配一个不同的空数组时,这将创建条目。
答案 1 :(得分: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