计算元素在数组中出现的次数

时间:2015-08-02 10:43:04

标签: arrays ruby count

我有一个包含[50, 20, 20, 5, 2]元素的数组,名为coins_used

我需要计算然后输出硬币在数组中出现的次数。使用coin_used x frequency的输出。

无论如何,我可以计算元素在数组中出现的次数,输出需要完全像这样:

50x1,20x2,5x1,2x1

最简单的方法是什么?

4 个答案:

答案 0 :(得分:4)

使用Array#uniq,您可以获得数组的唯一元素。 Array#count将返回数组中找到的项目数。

通过joining ,的映射数组,您可以获得所需内容:

a = [50,20,20,5,2]
a.uniq.map { |x| "#{x}x#{a.count(x)}" }.join(',')
# => "50x1,20x2,5x1,2x1"

更新使用Hash计算的更高效版本。

a = [50,20,20,5,2]
freq = Hash.new(0)
a.each { |x| freq[x] += 1 }
freq.map{ |key, value| "#{key}x#{value}" }.join(',')
# => "50x1,20x2,5x1,2x1"

答案 1 :(得分:1)

ruby​​ stdlib真的应该包含这样的方法(它在.pryrc中,我每天都使用它)

module Enumerable
  def count_by(&block)
    each_with_object(Hash.new(0)) do |elem, memo|
      value = block.call(elem)
      memo[value] += 1
    end
  end
end

你这样使用它:

[50, 20, 20, 5, 2].count_by{|e| e} # => {50=>1, 20=>2, 5=>1, 2=>1}
# ruby 2.2
[50, 20, 20, 5, 2].count_by(&:itself) # => {50=>1, 20=>2, 5=>1, 2=>1}

将此哈希转换为所需格式的字符串:)

答案 2 :(得分:1)

您可以group_by使用itself

a = [50,20,20,5,2]
a.group_by(&:itself).map { |k, v| "#{k}x#{v.size}" }.join(',')
# => "50x1,20x2,5x1,2x1"

答案 3 :(得分:0)

使用user host.net /some/random/path ,您可以执行以下操作:

Ruby >= 2.7