【问题标题】:how to get max and sum of 2nd column of array in ruby如何在ruby中获取数组第二列的最大值和总和
【发布时间】:2013-07-27 12:10:07
【问题描述】:

对于像这样的数组

s = [[1,2],[4,6],[2,7]]

如何在一个语句中选择每行第二列的最大值和总和

最大= 7
总和= 15

我知道,那

sum = 0
max = 0
s.each{ |a,b| sum+=b;if max<b then max = b end }

会起作用的。

【问题讨论】:

    标签: ruby arrays sum max


    【解决方案1】:
    second_elements = s.map { |el| el[1] }
    sum = second_elements.inject{|sum,x| sum + x }
    max = second_elements.max
    

    为了更清楚: inject{|sum,x| sum + x } 如果数组为空,则返回 nil,因此如果您想为空数组获取 0,请使用 inject(0, :+)

    【讨论】:

    • 没关系!!我需要的是:max = s.map { |el| el[1] }.max
    • @railscard:知道为什么我会得到:NoMethodError: undefined method 'sum' for [2, 6, 7]:Array 吗?
    • @sawa 但可以获取最大值。
    • @MarcinDoliwa sum 是来自 activesupport gem 的方法。
    • 这是更好的答案,因为它避免了两次计算第二个元素的数组。
    【解决方案2】:

    The transpose method 非常适合访问“列”:

    s = [[1,2],[4,6],[2,7]]
    col = s.transpose[1]
    p col.max #=> 7
    p col.inject(:+) #=> 15
    

    【讨论】:

      【解决方案3】:
      s.max {|a| a[1]}[1]          # Max of elements at index 1
      s.max {|a| a.last }.last     # Max of last elements
      # => 7
      

      如果你使用 Ruby 2.4 或更高版本/如果你在 Rails 上,求总和

      s.sum {|a| a[1]}             # Sum of elements at index 1
      s.sum(&:last)                # Sum of last elements
      # => 15
      

      其他

      s.inject(0) {|sum, a| sum+= a[1] }
      # => 15
      

      【讨论】:

        【解决方案4】:

        s.map{|e| e[1]}.max 给你最大值

        s.map{|e| e[1]}.reduce(:+) 给你总和。

        【讨论】:

        • s.flatten.max 返回所有数组的最大值。例如在 [[3,2]] 我想返回 2 而不是 3
        【解决方案5】:
        s = [[1,2],[4,6],[2,7]]
        second_max = s.max_by(&:last).last 
        # => 7
        sum = s.reduce(0){|sum,a| sum + a.last}
        # => 15
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-07-20
          • 2021-08-31
          • 2010-11-23
          • 1970-01-01
          • 2023-03-18
          • 2018-10-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多