13

我一直在阅读 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 文档中, a 的默认值Hashnil,这就是我假设出现此错误的原因。有没有更好的方法将每个键/(值 += 1)插入数字数组?

4

4 回答 4

27

尝试将默认值传递给您的新哈希

numbers = Hash.new(0)
于 2013-11-06T03:40:58.177 回答
2

您也可以明确地这样做:

array.each { |num| numbers[num] = (numbers[num] || 0) + 1 }
于 2013-11-06T03:43:10.647 回答
2

变体injectHash.new(0)

  numbers = [1,1,2,5,3,2,5,3,3,3].inject(Hash.new(0)){|numbers, number| numbers[number] +=1; numbers}
于 2013-11-06T03:55:01.393 回答
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] }]

如果您尝试一下,可能会有更好的方法。

于 2013-11-06T03:55:30.543 回答