【问题标题】:Populate hash with array keys and default value使用数组键和默认值填充哈希
【发布时间】:2014-01-31 04:30:14
【问题描述】:

陷入代码大战挑战:完成解决方案,使其接受一个键数组和一个默认值,并返回一个所有键都设置为默认值的哈希。

我的回答导致解析错误:

def solution([:keys, :default_value])
  return { :keys => " ", :default_value => " " }
end

我是否遗漏了返回哈希键并将 所有 键设置为默认值的内容?

【问题讨论】:

  • 虽然我更喜欢 Arup 的解决方案,但“初始化集合-添加到它-返回它”模式由 Ruby 中的 Enumerable#inject 处理:keys.inject({}) { |h, k| h.merge({k => default_val}) }keys.inject({}) { |h, k| h[k] = default_val ; h }
  • @Michael,要摆脱块末尾难看的hkeys.each_with_object({}) { |k, h| h[k] = default_val }
  • 用难看的方法名代替?我宁愿不要。

标签: ruby hash


【解决方案1】:

如下操作:

def solution(keys,default_val)
  Hash[keys.product([default_val])]
end

solution([:key1,:key2],12)  # => {:key1=>12, :key2=>12}

阅读Array#productKernel#Hash

【讨论】:

  • 谢谢。那么在数组之前使用Hash 将该数组转换为哈希?你能给我一个真实世界的例子,说明product 方法可以在哪里使用 - 我的意思是,为什么将相同的值分配给多个键?除了产品,我还有其他方法可以使用吗?
  • @Abraham 是的......然后做Hash[keys.zip([default_val]* keys.size)].. 但在这种情况下它不是惯用的......所以我使用Array#product
  • @Abraham 例如:您有一个包含句子中字母数量的哈希( {:a => 0, :b => 0...} )并且您计算每个字母,使用each_char 例如,您可以这样做 hash1[:a] += 1。如果没有默认值,您必须检查哈希是否包含键,如果是,您可以hash[:a]+=1,如果不是,您必须通过hash[:a] = 1 分配它。附言。 []#* 很有趣 - 它可以将字符串作为参数,而 []#product 会引发 TypeError。 [1,2,3].* '3' #=> "13233"。您忘记将 3 更改为 Numeric,并且您使用的是字符串而不是数组。
  • 不过,这会忘记复制默认值。
  • @Denis 你对我有什么建议吗?
【解决方案2】:

我建议修改您的解决方案:

def solution(keys, default_value)
  hash = {}
  keys.each do |key|
    value = default_value.dup rescue default_value
    hash[key] = value
  end
  hash
end

dup 是为了解决 default_value 是一个字符串的讨厌情况,然后你可以这样做:

hash[:foo] << 'bar'

...对于您的版本,这将修改多个值而不是单个值。

【讨论】:

  • 丹尼斯,我相信你知道你可以写keys.each_with_object({}) do |key, hash|来摆脱hash = {}hash最后,但选择这样做。我很想知道你对风格差异的看法。
  • 我只是在修复 OP 的功能。我自己编写的代码更像Hash[keys.map{ |k| [k, val] }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多