使用数组键和默认值填充哈希

Posted

技术标签:

【中文标题】使用数组键和默认值填充哈希【英文标题】: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 用难看的方法名代替?我宁愿不要。 【参考方案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]

以上是关于使用数组键和默认值填充哈希的主要内容,如果未能解决你的问题,请参考以下文章

从Array.product填充的Ruby Hash会产生意外行为

检查数组是不是已经完全填充了任何非默认值

具有默认值的打字稿固定数组

Perl如何访问作为另一个哈希值的数组元素的哈希?

如何用不同的默认值初始化多维数组

主键约束,外键约束,空值约束,默认值约束,唯一约束,检查约束的各个作用是啥?