【问题标题】:ruby arrays count of most frequent element [duplicate]最常见元素的红宝石数组计数[重复]
【发布时间】:2017-01-05 17:55:17
【问题描述】:

我试图弄清楚如何在整数数组中找到最常见元素的计数。我可以想到一些可能有用的方法,但是当我在块内编写表达式时,我完全不知道如何将一个元素与下一个和前一个元素进行比较。有任何想法吗?非常感谢所有帮助!!!

【问题讨论】:

  • 这个问题是重复的,这不足为奇。然而,目前尚不清楚它是哪个问题的重复。我对这个问题的解读是要返回最大计数(“......如何找到数组中最频繁元素的计数......”)。 (请参阅@Tadman 对我的回答的评论。)“这个问题在这里已经有了答案:”的来源要求计数最多的元素。当然,从回答该问题到获得最大计数只有很短的一步,但如果只需要最大计数,可能会有更好的方法。

标签: ruby-on-rails arrays ruby integer


【解决方案1】:

一个简单的方法是确定所有唯一值,将每个值转换为其在数组中的计数,然后确定最大计数。

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(0) 的说明,请参阅Hash::new。简而言之,如果h = Hash.new(0)h 没有键kh[k] 将返回默认值,这里是零。 h[k] += 1 扩展为 h[k] = h[k] + 1,因此如果 h 没有密钥 k,则变为 h[k] = 0 + 1。另一方面,如果说h[k] => 2,那么h[k] = h[k] + 1 #=> h[k] = 3 + 1

【讨论】:

  • 别忘了max_by
  • @tadman,我考虑过max_by,但需要的是最大计数,而不是具有最大计数的元素。如果我使用 max_by 我需要重新计算该元素的计数,这没有吸引力。
  • 这是对问题的一种解释,这是真的。我以另一种方式阅读它,希望最频繁的元素基于计数。
  • 谢谢卡里!您的解决方案提供了非常丰富的信息。真的帮助了我的理解。
猜你喜欢
  • 1970-01-01
  • 2019-12-24
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
  • 2012-09-13
  • 2012-05-16
  • 2022-01-21
  • 2014-01-05
相关资源
最近更新 更多