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 }