ruby-on-rails - 最常见元素的ruby数组计数

标签 ruby-on-rails arrays ruby integer

<分区>

我正在尝试弄清楚如何计算整数数组中出现频率最高的元素的数量。我可以想到一些可能有用的方法,但是当我开始在 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 没有键 kh[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/

相关文章:

ruby - 在 Ruby 中创建目录 ENOENT 错误

mysql - rails 。 MySQL。变量 'sql_mode'不能设置为 'STRICT_ALL_TABLES'的值

ruby-on-rails - 未定义的方法 `edit_..._path'

ruby-on-rails - 将 Google Analytics 添加到应用程序

c++ - 从随机起始位置开始的螺旋阵列

ruby - 创建 ruby gem

ruby-on-rails - 使用 OAuth 连接到 Linkedin 时,是否可以获取用户的非主要电子邮件地址?

ios - NSPredicate 使用数组作为过滤器

javascript - 使用键数组过滤对象数组[逆]

ruby - Ruby 中 Kernel::eval 的风险和注意事项?