如何通过Ruby返回数组中最频繁重复值的所有键

时间:2014-05-20 12:37:53

标签: ruby

我希望获得具有最大值的所有键。

# I want 6 and 2 since they both of them occurred three times.
arr = [5, 6, 2, 1, 2, 5, 6, 6, 2]

我尝试了这个,但它只返回6.

# this returns {5=>2, 6=>3, 2=>3, 1=>1}
freq = hash.inject(Hash.new(0)){ |h, v| h[v] += 1; h }
# then I use max_by, but this gives only 6
p arr.max_by{ |v| freq[v]}

4 个答案:

答案 0 :(得分:4)

我建议对原始数组中唯一值的出现次数group_by,然后取最高数字映射的值:

arr = [5, 6, 2, 1, 2, 5, 6, 6, 2]
arr.uniq.group_by { |v| arr.count(v) }.max.last
# [6, 2]

group_by产生一个Hash,其中出现次数为arr的关键字和唯一元素,其中出现次数为值。然后,.max调用将生成具有最高键的映射,.last将仅采用我们感兴趣的值。

答案 1 :(得分:3)

怎么样?
arr = [5, 6, 2, 1, 2, 5, 6, 6, 2]

uniques = arr.uniq
max_count = uniques.map { |v| arr.count(v) }.max
max_values = uniques.select { |v| arr.count(v) == max_count }
#=> [6, 2]

答案 2 :(得分:0)

我认为

arr.group_by(&:to_i).each_with_object({}) do |(k,v),h| 
   (h[v.size] ||= []) << k 
end.max_by(&:first).last # => [6, 2] 

答案 3 :(得分:0)

arr = [5, 6, 2, 1, 2, 5, 6, 6, 2]
freq = arr.inject(Hash.new(0)) { |h, v| h[v] += 1; h }   

max = freq.max[1]
freq.keep_if { |h, v| v == max }.keys
# => [6, 2]

代码非常自我解释。我只是在freq.keep_if之前使用您的代码。 freq.max以[6,3]的形式返回一个数组(6为数字,3为出现次数),因此freq.max [1]为出现次数。 .keys返回数组中的所有键,从而消除了这些键。