如何将对象添加到数组中,其中数组是散列中键的值?

时间:2015-04-07 01:14:49

标签: ruby arrays hash

基本上我的代码如下

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)

2 个答案:

答案 0 :(得分: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]a中留下bh中没有任何内容。

如果您想在访问默认设置时自动添加默认设置,则需要使用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
相关问题