我发现自己反复想计算数组中某个项目的出现次数,并显示顶部项目及其实际计数。我已经多次编写如下代码,我认为它是一种反复出现的、引发 RSI 的模式:
hits = Hash[ array.group_by{|o|o}.map{|o,a|[o,a.length]}.sort_by{|o,ct|[-ct,o]} ]
require 'pp'
pp hits
我可以把它移到 Enumerable 上的一个猴子补丁中……</p>
module Enumerable
def counts(&blk)
blk ||= ->(o){o}
Hash[ group_by(&blk).map{|o,a| [o,a.length] }.sort_by{|o,ct| [-ct,o] } ]
end
end
a = %w[a b a b c d e g j a e c d k o k i l p a e c f d e a d e f s d v c ]
pp a.counts
#=> {"a"=>5,
#=> "d"=>5,
#=> "e"=>5,
#=> "c"=>4,
#=> "b"=>2,
#=> "f"=>2,
#=> "k"=>2,
#=> "g"=>1,
#=> "i"=>1,
#=> "j"=>1,
#=> "l"=>1,
#=> "o"=>1,
#=> "p"=>1,
#=> "s"=>1,
#=> "v"=>1}
…但我想知道是否有更优雅的方式来使用核心 Ruby 方法来完成这个(更少的输入就足够了)。