簡體   English   中英

如何在Ruby中對數字數組求和?

[英]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.inject(0){|sum,x| sum + x }

請參閱 Ruby 的可枚舉文檔

(注意:需要0基本情況,以便0將在空數組而不是nil上返回)

array.reduce(0, :+)

雖然等同於array.inject(0, :+) ,但隨着MapReduce 編程模型的興起,術語reduce正在進入一個更常見的白話。

injectreducefoldaccumulatecompress都是一類折疊函數的同義詞。 我發現您的代碼庫的一致性最重要,但由於各個社區傾向於使用一個詞而不是另一個詞,因此了解替代方案仍然很有用。

為了強調 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

Ruby 2.4.0 的新功能

您可以使用恰當命名的方法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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM