【发布时间】: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 }
会起作用的。
【问题讨论】:
对于像这样的数组
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 }
会起作用的。
【问题讨论】:
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, :+)
【讨论】:
NoMethodError: undefined method 'sum' for [2, 6, 7]:Array 吗?
sum 是来自 activesupport gem 的方法。
The transpose method 非常适合访问“列”:
s = [[1,2],[4,6],[2,7]]
col = s.transpose[1]
p col.max #=> 7
p col.inject(:+) #=> 15
【讨论】:
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
【讨论】:
s.map{|e| e[1]}.max 给你最大值
s.map{|e| e[1]}.reduce(:+) 给你总和。
【讨论】:
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
【讨论】: