bra*_*fck 551 ruby arrays math sum
我有一个整数数组.
例如:
array = [123,321,12389]
Run Code Online (Sandbox Code Playgroud)
有什么好方法可以得到它们的总和吗?
我知道
sum = 0
array.each { |a| sum+=a }
Run Code Online (Sandbox Code Playgroud)
会工作.
小智 795
或者尝试Ruby 1.9方式:
array.inject(0, :+)
Run Code Online (Sandbox Code Playgroud)
注意:0需要基本情况,否则nil将在空数组上返回:
> [].inject(:+)
nil
> [].inject(0, :+)
0
Run Code Online (Sandbox Code Playgroud)
zen*_*azn 599
试试这个:
array.inject(0){|sum,x| sum + x }
Run Code Online (Sandbox Code Playgroud)
(注意:0需要基本情况,以便0在空数组上返回而不是nil)
Eva*_*van 281
array.reduce(0, :+)
Run Code Online (Sandbox Code Playgroud)
虽然相当于array.inject(0, :+),但随着MapReduce编程模型的兴起,术语" reduce"正在进入一种更常见的语言.
注入,缩小,折叠,累积和压缩都是一类折叠函数的同义词.我发现代码库的一致性最为重要,但由于各个社区倾向于选择一个词而不是另一个词,因此了解备选方案仍然很有用.
为了强调map-reduce verbiage,这里的版本对于该数组中最终的内容有点宽容.
array.map(&:to_i).reduce(0, :+)
Run Code Online (Sandbox Code Playgroud)
一些额外的相关阅读:
Mik*_*use 110
或者(仅用于比较),如果您安装了Rails(实际上只是ActiveSupport):
require 'activesupport'
array.sum
Run Code Online (Sandbox Code Playgroud)
jrh*_*cks 61
mokeypatch基类是危险的,现在Ruby 2.4.0对Enumerables总结了它并不危险.如果你喜欢危险并使用旧版本的Ruby,你可以添加sum到#sum类中:
[1, 2, 3, 4].sum
Run Code Online (Sandbox Code Playgroud)
然后做有趣的事情,如:
class Array
def sum
inject(0) { |sum, x| sum + x }
end
end
Run Code Online (Sandbox Code Playgroud)
Eli*_*off 43
您可以使用恰当命名的方法Enumerable#sum.它有很多优点,inject(:+)但最后也有一些重要的注意事项要阅读.
(1..100).sum
#=> 5050
Run Code Online (Sandbox Code Playgroud)
[1, 2, 4, 9, 2, 3].sum
#=> 21
[1.9, 6.3, 20.3, 49.2].sum
#=> 77.7
Run Code Online (Sandbox Code Playgroud)
这种方法不等同于#inject(:+).例如
%w(a b c).inject(:+)
#=> "abc"
%w(a b c).sum
#=> TypeError: String can't be coerced into Integer
Run Code Online (Sandbox Code Playgroud)
也,
(1..1000000000).sum
#=> 500000000500000000 (execution time: less than 1s)
(1..1000000000).inject(:+)
#=> 500000000500000000 (execution time: upwards of a minute)
Run Code Online (Sandbox Code Playgroud)
Has*_*ail 19
只是为了多样性,如果您的数组不是数字数组,而是具有数字属性(例如数量)的对象数组,您也可以这样做:
array.inject(0){|sum,x| sum + x.amount}
Run Code Online (Sandbox Code Playgroud)
col*_*ect 19
Ruby 2.4+/Rails - array.sum即[1, 2, 3].sum # => 6
Ruby pre 2.4 - array.inject(:+)或array.reduce(:+)
*注意:该#sum方法是2.4的新增功能,enumerable因此您现在可以array.sum在纯红宝石中使用,而不仅仅是Rails.
Ruby 2.4.0已发布,它具有Enumerable#sum方法。所以你可以做
array.sum
Run Code Online (Sandbox Code Playgroud)
来自文档的示例:
{ 1 => 10, 2 => 20 }.sum {|k, v| k * v } #=> 50
(1..10).sum #=> 55
(1..10).sum {|v| v * 2 } #=> 110
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
417143 次 |
| 最近记录: |