[英]How to sum array of numbers in Ruby?
我有一個整數數組。
例如:
array = [123,321,12389]
有什么好的方法可以得到它們的總和嗎?
我知道
sum = 0
array.each { |a| sum+=a }
會工作。
或者試試 Ruby 1.9 的方式:
array.inject(0, :+)
注意:需要0
基本情況,否則空數組將返回nil
:
> [].inject(:+)
nil
> [].inject(0, :+)
0
array.reduce(0, :+)
雖然等同於array.inject(0, :+)
,但隨着MapReduce 編程模型的興起,術語reduce正在進入一個更常見的白話。
inject 、 reduce 、 fold 、 accumulate和compress都是一類折疊函數的同義詞。 我發現您的代碼庫的一致性最重要,但由於各個社區傾向於使用一個詞而不是另一個詞,因此了解替代方案仍然很有用。
為了強調 map-reduce 措辭,這里有一個版本,該版本對數組中的內容更加寬容。
array.map(&:to_i).reduce(0, :+)
一些額外的相關閱讀:
或者(僅用於比較),如果您安裝了 Rails(實際上只是 ActiveSupport):
require 'activesupport'
array.sum
對於 Ruby >=2.4.0,您可以使用 Enumerables 中的sum
。
[1, 2, 3, 4].sum
mokeypatch 基類是危險的。 如果您喜歡危險並使用舊版本的 Ruby,您可以將#sum
添加到Array
類:
class Array
def sum
inject(0) { |sum, x| sum + x }
end
end
您可以使用恰當命名的方法Enumerable#sum
。 它比inject(:+)
有很多優點,但最后也有一些重要的注釋需要閱讀。
(1..100).sum
#=> 5050
[1, 2, 4, 9, 2, 3].sum
#=> 21
[1.9, 6.3, 20.3, 49.2].sum
#=> 77.7
此方法不等同於#inject(:+)
。 例如
%w(a b c).inject(:+)
#=> "abc"
%w(a b c).sum
#=> TypeError: String can't be coerced into Integer
還,
(1..1000000000).sum
#=> 500000000500000000 (execution time: less than 1s)
(1..1000000000).inject(:+)
#=> 500000000500000000 (execution time: upwards of a minute)
有關為什么sum
是這樣的更多信息,請參閱此答案。
Ruby array.sum
/ Rails - array.sum
即[1, 2, 3].sum # => 6
Ruby 2.4 之前 - array.inject(:+)
或array.inject(:+)
array.reduce(:+)
*注: #sum
方法是一個新的除了2.4 enumerable
,所以你現在可以使用array.sum
純紅寶石,而不僅僅是Rails的。
只是為了多樣性,如果您的數組不是數字數組,而是具有數字屬性(例如數量)的對象數組,您也可以這樣做:
array.inject(0){|sum,x| sum + x.amount}
ruby 1.8.7 方式如下:
array.inject(0, &:+)
您可以簡單地使用:
example = [1,2,3]
example.inject(:+)
Ruby 2.4.0 發布,它有一個Enumerable#sum方法。 所以你可以做
array.sum
文檔中的示例:
{ 1 => 10, 2 => 20 }.sum {|k, v| k * v } #=> 50
(1..10).sum #=> 55
(1..10).sum {|v| v * 2 } #=> 110
這足夠[1,2,3].inject('+')
對於具有 nil 值的數組,我們可以進行壓縮,然后注入總和 ex-
a = [1,2,3,4,5,12,23.45,nil,23,nil]
puts a.compact.inject(:+)
還允許[1,2].sum{|x| x * 2 } == 6
[1,2].sum{|x| x * 2 } == 6
:
# http://madeofcode.com/posts/74-ruby-core-extension-array-sum
class Array
def sum(method = nil, &block)
if block_given?
raise ArgumentError, "You cannot pass a block and a method!" if method
inject(0) { |sum, i| sum + yield(i) }
elsif method
inject(0) { |sum, i| sum + i.send(method) }
else
inject(0) { |sum, i| sum + i }
end
end
end
array.reduce(:+)
也適用於范圍 ...因此,
(1..10).reduce(:+) returns 55
方法一:
[1] pry(main)> [1,2,3,4].sum
=> 10
[2] pry(main)> [].sum
=> 0
[3] pry(main)> [1,2,3,5,nil].sum
TypeError: nil can't be coerced into Integer
方法二:
[24] pry(main)> [].inject(:+)
=> nil
[25] pry(main)> [].inject(0, :+)
=> 0
[4] pry(main)> [1,2,3,4,5].inject(0, :+)
=> 15
[5] pry(main)> [1,2,3,4,nil].inject(0, :+)
TypeError: nil can't be coerced into Integer
from (pry):5:in `+'
方法三:
[6] pry(main)> [1,2,3].reduce(:+)
=> 6
[9] pry(main)> [].reduce(:+)
=> nil
[7] pry(main)> [1,2,nil].reduce(:+)
TypeError: nil can't be coerced into Integer
from (pry):7:in `+'
方法 4:當 Array 包含 nil 和空值時,默認情況下,如果您使用上述任何函數 reduce、sum、inject 將通過
TypeError:nil 不能被強制轉換為 Integer
你可以通過,
[16] pry(main)> sum = 0
=> 0
[17] pry(main)> [1,2,3,4,nil, ''].each{|a| sum+= a.to_i }
=> [1, 2, 3, 4, nil, ""]
[18] pry(main)> sum
=> 10
方法六:評估
評估字符串中的 Ruby 表達式。
[26] pry(main)> a = [1,3,4,5]
=> [1, 3, 4, 5]
[27] pry(main)> eval a.join '+'
=> 13
[30] pry(main)> a = [1,3,4,5, nil]
=> [1, 3, 4, 5, nil]
[31] pry(main)> eval a.join '+'
SyntaxError: (eval):1: syntax error, unexpected end-of-input
1+3+4+5+
如果你覺得打高爾夫球,你可以做
eval [123,321,12389]*?+
這將創建一個字符串“123+321+12389”,然后使用函數 eval 進行求和。 這僅用於打高爾夫球,您不應該在正確的代碼中使用它。
或者您可以嘗試以下方法:
def sum arr
0 if arr.empty
arr.inject :+
end
這是最短的方法。 試試吧。
array.inject :+
number = [1..100]
number. each do |n|
final_number = n.sum
puts "The sum is #{final_number}"
end
*這對我作為新開發人員來說非常有效。 您可以通過更改[]中的值來調整數字范圍
我們可以對數組求和的3種方法
1) array.inject(0){|sum,x| sum + x }
array.inject(0){|sum,x| sum + x }
2) array.inject('+')
3) array.join('+')
您也可以輕松完成
def sum(numbers)
return 0 if numbers.length < 1
result = 0
numbers.each { |num| result += num }
result
end
您可以使用.map和.sum ,例如:
array.map { |e| e }.sum
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.