【问题标题】:How do I find the maximum value of an object's attribute that occurs exactly twice in an array?如何找到在数组中恰好出现两次的对象属性的最大值?
【发布时间】:2017-06-30 16:36:02
【问题描述】:

我使用的是 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”是所有属性中的最大值,但它在数组中只出现一次。

【问题讨论】:

  • 哦,“numeric_attr”是字段的名称。所以一个对象只能有一个名为“numeric_attr”的字段。这有意义吗?
  • arr.uniq.select { |e| arr.count(e) == 2 }.max
  • @iceツ 这是O(N²) 在最坏的情况下。

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


【解决方案1】:
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

【讨论】:

    【解决方案2】:

    由于您使用的是 rails 计算,例如#maximum 这应该适合你

    my_objects_arr
      .group(:numeric_attr)
      .having("count(numeric_attr) = 2")
      .maximum(:numeric_attr)
    

    这将找到numeric_attr 的最大值,方法是将它们按numeric_attr 分组并选择恰好有2 的numeric_attr

    SQL 估计

    SELECT 
      MAX(numeric_attr)
    FROM 
      [SOME TABLE]
    GROUP BY 
      numeric_attr
    HAVING 
      COUNT(numeric_attr) = 2
    

    【讨论】:

    • 对于 Rails,这是一条可行的路。 旁注:请尊重使用智能手机阅读的人,格式行更短。
    【解决方案3】:
    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 的形式创建一个默认值为0 的散列h。这意味着如果h 没有密钥kh[k] 将返回零(不更改哈希)。这里指的是方法Hash#[],不要和Hash#[]=混淆。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-08
      • 2017-06-05
      • 2012-03-04
      • 1970-01-01
      • 2012-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多