计算数组中的不同元素

我有一个数组:

a = [1, 2, 3, 3, 6, 8, 1, 9] 

我想显示每个唯一元素值及其相关元素计数如下:

 1: 2 2: 1 3: 2 6: 1 8: 1 9: 1 

到目前为止我有:

 a.sort.group_by { |x| x } { 1 => [ [0] 1, [1] 1 ], 2 => [ [0] 2 ], 3 => [ [0] 3, [1] 3 ], 6 => [ [0] 6 ], 8 => [ [0] 8 ], 9 => [ [0] 9 ] } 

因此Hash的每个元素都包含一个数组。 我可以使用该数组的计数来得到我的答案,但我很难弄清楚如何简洁地处理哈希。

这是一个可怕的实施?

 a.sort.group_by { |x| x }.each {|x| puts "#{x[0]} #{x[1].count}" } 

怎么样:

 a.inject({}) { |a,e| a[e] = (a[e] || 0) + 1; a } => {1=>2, 2=>1, 3=>2, 6=>1, 8=>1, 9=>1} 

例如:

 h = a.inject({}) { |a,e| a[e] = (a[e] || 0) + 1; a } => {1=>2, 2=>1, 3=>2, 6=>1, 8=>1, 9=>1} h.keys.sort.each { |k| puts "#{k}: #{h[k]}" } 1: 2 2: 1 3: 2 6: 1 8: 1 9: 1 

来自以下其他人的评论:

 a.each_with_object(Hash.new(0)) { |e,a| a[e] += 1 } => {1=>2, 2=>1, 3=>2, 6=>1, 8=>1, 9=>1} 

使用uniq获取唯一的数组值并sort以按升序对它们进行排序。 然后,对于这些值x每一个,显示a.count(x)

 a = [1, 2, 3, 3, 6, 8, 1, 9] a.uniq.sort.each {|x| puts '%d: %d' % [x, a.count(x)] } 

为了提高效率,请创建一个哈希,将值映射到它在数组中出现的次数。 一种简单的方法是初始化一个Hash对象,默认情况下将键映射到零。 然后,当您遍历数组时,可以将每个值的计数递增1。

 counts = Hash.new(0) a.each {|x| counts[x] += 1 } counts.keys.sort.each {|x| puts '%d: %d' % [x, counts[x]] } 

考虑一下:

 a = [1, 2, 3, 3, 6, 8, 1, 9] a.group_by{ |n| n } # => {1=>[1, 1], 2=>[2], 3=>[3, 3], 6=>[6], 8=>[8], 9=>[9]} a.group_by{ |n| n }.map{ |k, v| [k, v.size ] } # => [[1, 2], [2, 1], [3, 2], [6, 1], [8, 1], [9, 1]] 

最后:

 a.group_by{ |n| n }.map{ |k, v| [k, v.size ] }.to_h # => {1=>2, 2=>1, 3=>2, 6=>1, 8=>1, 9=>1} 

试试这个

 module Enumerable def freq hash = Hash.new(0) each { |each| hash[each] += 1 } hash end end 

然后

 [1, 2, 3, 3, 6, 8, 1, 9].freq # => {1=>2, 2=>1, 3=>2, 6=>1, 8=>1, 9=>1}