如何找到在数组中恰好出现两次的对象属性的最大值?

时间:2017-06-30 16:36:02

标签: ruby-on-rails arrays ruby attributes max

我正在使用Ruby 2.4。如果我想找到我的模型的数字属性的最大数量,我可以

max_num = my_objects_arr.maximum(:numeric_attr)

但是如何在数组中找到其值恰好出现两次的最大属性数?也就是说,假设我的对象数组有三个对象

obj1 - numeric_attr = 3
obj2 - numeric_attr = 3
obj3 - numeric_attr = 4

上面出现两次的属性的最大值为“3”。虽然“4”是所有属性的最大值,但它只在阵列中出现一次。

3 个答案:

答案 0 :(得分:2)

array = [1, 2, 3, 2, 3, 4]

array.group_by { |e| e } # group_by(&:itself) since 2.3
     .select { |_, v| v.count == 2 }
     .keys
     .max
#⇒ 3

对象和属性:

my_objects_arr.group_by { |o| o.numeric_attr }
              .select { |_, v| v.count == 2 }
              .keys
              .max

自己获取对象:

my_objects_arr.group_by { |o| o.numeric_attr }
              .select { |_, v| v.count == 2 }
              .max_by(&:first)
              .last

答案 1 :(得分:2)

由于您正在使用轨道计算,例如0 1975-05-28 14:42:41.430 1 1975-05-28 14:42:41.430 2 1975-05-28 15:15:50.338 Name: timestamp, dtype: datetime64[ns] 这应该对你有用

#maximum

这会找到my_objects_arr .group(:numeric_attr) .having("count(numeric_attr) = 2") .maximum(:numeric_attr) 的最大值,方法是按numeric_attr对其进行分组,然后选择恰好为2的numeric_attr

SQL估算

numeric_attr

答案 2 :(得分:1)

arr = [1, 2, 3, 2, 3, 4]

arr.each_with_object(Hash.new(0)) {|n,h| h[n] += 1}.select {|_,nbr| nbr == 2}.keys.max
  #=> 3

这使用Hash::new的形式创建一个默认值为零的哈希h。这意味着如果h没有密钥kh[k]将返回零(不更改哈希)。这是指方法Hash#[],不要与Hash#[]=混淆。