我有一个包含[50, 20, 20, 5, 2]
元素的数组,名为coins_used
。
我需要计算然后输出硬币在数组中出现的次数。使用coin_used x frequency
的输出。
无论如何,我可以计算元素在数组中出现的次数,输出需要完全像这样:
50x1,20x2,5x1,2x1
最简单的方法是什么?
答案 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)
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