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

问题描述 投票:0回答:2

所以基本上我的代码如下

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)
ruby arrays hash
2个回答
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留下b,但在h没有任何东西。

如果你想在访问它们时自动添加默认值,你需要使用default_proc,而不是简单的default

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

这将在您访问不存在的键时创建条目,并为每个键提供不同的空数组。


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
© www.soinside.com 2019 - 2024. All rights reserved.