计算数组中的不同元素

时间:2015-08-24 21:18:29

标签: arrays ruby enumeration

我有一个数组:

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}" }

4 个答案:

答案 0 :(得分:3)

怎么样:

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} 

答案 1 :(得分:3)

使用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]] }

答案 2 :(得分:2)

考虑一下:

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}

答案 3 :(得分:0)

试试这个

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}