我希望获得具有最大值的所有键。
# 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]}
答案 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
返回数组中的所有键,从而消除了这些键。