<分区>
我正在尝试弄清楚如何计算整数数组中出现频率最高的元素的数量。我可以想到一些可能有用的方法,但是当我开始在 block 内编写表达式时,我完全不知道如何比较元素与下一个元素和上一个元素。有任何想法吗?非常感谢所有帮助!!!
<分区>
我正在尝试弄清楚如何计算整数数组中出现频率最高的元素的数量。我可以想到一些可能有用的方法,但是当我开始在 block 内编写表达式时,我完全不知道如何比较元素与下一个元素和上一个元素。有任何想法吗?非常感谢所有帮助!!!
最佳答案
一个简单的方法是确定所有唯一值,将每个值转换为其在数组中的计数,然后确定最大计数。
def max_count(arr)
arr.uniq.map { |n| arr.count(n) }.max
end
例如:
arr = [1,2,4,3,2,6,3,4,2]
max_count(arr)
#=> 3
分为三个步骤:
a = arr.uniq
#=> [1, 2, 4, 3, 6]
b = a.map { |n| arr.count(n) }
#=> [1, 3, 2, 2, 1]
b.max
#=> 3
一种更有效的方法(因为 arr
的元素只被枚举一次)是使用计数哈希:
def max_count(arr)
arr.each_with_object(Hash.new(0)) { |n,h| h[n] += 1 }.values.max
end
max_count(arr)
#=> 3
我们有:
a = arr.each_with_object(Hash.new(0)) { |n,h| h[n] += 1 }
#=> {1=>1, 2=>3, 4=>2, 3=>2, 6=>1}
b = a.values
#=> [1, 3, 2, 2, 1]
b.max
#=> 3
参见 Hash::new Hash.new(0)
的解释。简而言之,如果 h = Hash.new(0)
并且 h
没有键 k
,h[k]
将返回默认值,此处为零。 h[k] += 1
扩展为 h[k] = h[k] + 1
,因此如果 h
没有 key k
,这变成了 h[k] = 0 + 1
。另一方面,如果,比方说,h[k] => 2
,那么 h[k] = h[k] + 1 #=> h[k] = 3 + 1
。
关于ruby-on-rails - 最常见元素的ruby数组计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39210688/