ruby:如何在数组中找到非唯一元素并打印每个元素的出现次数?

我有

a = ["a", "d", "c", "b", "b", "c", "c"] 

并且需要打印类似的东西(按出现次数降序排序):

 c:3 b:2 

我理解第一部分(发现非独特)是:

 b = a.select{ |e| a.count(e) > 1 } => ["c", "b", "b", "c", "c"] 

要么

 puts b.select{|e, c| [e, a.count(e)] }.uniq c b 

如何输出每个非唯一的向后排序的出现次数?

 puts a.uniq. map { | e | [a.count(e), e] }. select { | c, _ | c > 1 }. sort.reverse. map { | c, e | "#{e}:#{c}" } 

group_by方法经常用于此:

 a.group_by {| i | 一世 }
 {
     “a”=> [
         [0]“一个”
     ]
     “d”=> [
         [0]“d”
     ]
     “c”=> [
         [0]“c”,
         [1]“c”,
         [2]“c”
     ]
     “b”=> [
         [0]“b”,
         [1]“b”
     ]
 }

我喜欢:

 a.group_by {| i |  i} .each_with_object({}){|(k,v),h |  h [k] = v.size}
 {
     “a”=> 1,
     “d”=> 1,
     “c”=> 3,
     “b”=> 2
 }

要么:

哈希[a.group_by {| i | 我} .map {| k,v |  [k,v.size]}]
 {
     “a”=> 1,
     “d”=> 1,
     “c”=> 3,
     “b”=> 2
 }

其中一个可能会刮伤你的痒。 从那里你可以使用一点测试来减少结果:

哈希[a.group_by {| i | 我} .map {| k,v |  v.size> 1 && [k,v.size]}]
 {
     “c”=> 3,
     “b”=> 2
 }

如果您只想打印信息,请使用:

把a.group_by {| i | 我} .map {| k,v |  “#{k}:#{v.size}”}
 a:1
 d:1
 c:3
 b:2

我个人喜欢这个解决方案:

  a.inject({}) {|hash, val| hash[val] ||= 0; hash[val] += 1; hash}. reject{|key, value| value == 1}.sort.reverse. each_pair{|k,v| puts("#{k}:#{v}")} 
 a.reduce(Hash.new(0)) { |memo,x| memo[x] += 1; memo } # Frequency count. .select { |_,count| count > 1 } # Choose non-unique items. .sort_by { |x| -x[1] } # Sort by number of occurrences descending. # => [["c", 3], ["b", 2]] 

也:

 a.group_by{|x|x}.map{|k,v|[k,v.size]}.select{|x|x[1]>1}.sort_by{|x|-x[1]} # => [["c", 3], ["b", 2]] 

这将为您提供一个带element => occurrences的哈希:

 b.reduce(Hash.new(0)) do |hash, element| hash[element] += 1 hash end 

怎么样:

 a.sort.chunk{|x| a.count(x)}.sort.reverse.each do |n, v| puts "#{v[0]}:#{n}" if n > 1 end 
 puts a.uniq. map { |e| a.count(e) > 1 ? [e, a.count(e)] : nil }.compact. sort { |a, b| b.last <=> a.last }