我一直在阅读Ruby文档,并查看有关此问题的其他帖子,但我仍然对此感到疑惑:
#counts each number in an array once
array = [1,1,2,5,3,2,5,3,3,3]
numbers = {}
array.each { |num| numbers[num] += 1 }
=> in `block in mode': undefined method `+' for nil:NilClass (NoMethodError)
在Hash documentation中,Hash
的默认值为nil
,这就是我假设我收到此错误的原因。有没有更好的方法将每个键/(值+ = 1)插入数字数组?
答案 0 :(得分:24)
尝试将default值传递给新哈希
numbers = Hash.new(0)
答案 1 :(得分:7)
您可以创建一个使用0
作为默认值的哈希:
numbers = Hash.new(0)
答案 2 :(得分:2)
你也可以用这种方式明确地做到这一点:
array.each { |num| numbers[num] = (numbers[num] || 0) + 1 }
答案 3 :(得分:2)
与inject
和Hash.new(0)
numbers = [1,1,2,5,3,2,5,3,3,3].inject(Hash.new(0)){|numbers, number| numbers[number] +=1; numbers}
答案 4 :(得分:1)
除了使用哈希默认值,您还可以尝试使用group_by
:
array = [1,1,2,5,3,2,5,3,3,3]
numbers = Hash[*array.group_by { |i| i }.flat_map { |k, v| [k , v.size] }]
如果你玩一些它可能有更好的方法。