ruby数组计算最常见的元素

时间:2016-08-29 16:12:51

标签: ruby-on-rails arrays ruby integer

我正在试图找出如何在整数数组中找到最频繁元素的计数。我可以想到一些可能有用的方法但是当我在块中编写表达式时,我完全迷失了如何将元素与下一个元素和前一个元素进行比较。有任何想法吗?真的非常感谢所有的帮助!

1 个答案:

答案 0 :(得分:4)

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

$yourHtmlField.rules( "add", {
  required: true,
  messages: {
    required: "Required input"
  }
});

例如:

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)没有密钥hk将返回默认值,此处为零。 h[k]扩展为h[k] += 1,因此如果h[k] = h[k] + 1没有密钥h,则会变为k。另一方面,如果是h[k] = 0 + 1,那么h[k] => 2