使用数组键和默认值填充哈希
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,要摆脱块末尾难看的h
:keys.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#product
和Kernel#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]
。以上是关于使用数组键和默认值填充哈希的主要内容,如果未能解决你的问题,请参考以下文章