605

整数の配列があります。

例えば:

array = [123,321,12389]

それらの合計を取得するための良い方法はありますか?

そんなこと知ってる

sum = 0
array.each { |a| sum+=a }

動作します。

4

16 に答える 16

834

ruby> = 2.4の場合、 sumを使用できます:

array.sum

ルビー<2.4の場合、注入を使用できます。

array.inject(0, :+)

注:0基本ケースが必要です。そうでない場合はnil、空の配列で返されます。

> [].inject(:+)
nil
> [].inject(0, :+)
0
于 2009-10-08T16:28:13.253 に答える
641

これを試して:

array.inject(0){|sum,x| sum + x }

Rubyの列挙可能なドキュメントを参照してください

(注:0ベースケースは0、ではなく空の配列で返されるようにするために必要ですnil

于 2009-10-08T16:07:04.170 に答える
302
array.reduce(0, :+)

と同等ですがarray.inject(0, :+)、Reduceという用語は、 MapReduceプログラミングモデルの台頭とともに、より一般的な言葉になりつつあります

インジェクトリデュースフォールドアキュムレート、および圧縮はすべて、フォールディング関数のクラスと同義です。コードベース全体の一貫性が最も重要だと思いますが、さまざまなコミュニティが1つの単語を別の単語よりも好む傾向があるため、それでも代替案を知っておくと便利です。

map-reduceの言い回しを強調するために、これは、その配列に何が含まれるかについてもう少し寛容なバージョンです。

array.map(&:to_i).reduce(0, :+)

いくつかの追加の関連読書:

于 2012-12-14T17:06:59.070 に答える
117

または(比較のために)、Railsがインストールされている場合(実際にはActiveSupportのみ):

require 'activesupport'
array.sum
于 2009-10-08T16:49:10.013 に答える
91

Ruby> = 2.4.0の場合sum、Enumerablesから使用できます。

[1, 2, 3, 4].sum

基本クラスをmokeypatchするのは危険です。危険が好きで、古いバージョンのRubyを使用している場合は#sumArrayクラスに追加できます。

class Array
  def sum
    inject(0) { |sum, x| sum + x }
  end
end
于 2009-10-08T18:29:42.447 に答える
51

Ruby2.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

于 2017-01-04T03:33:18.550 に答える
22

Ruby 2.4+/Rails-array.sumつまり[1, 2, 3].sum # => 6

Rubypre2.4-array.inject(:+)またはarray.reduce(:+)

*注:この#sumメソッドは2.4に新しく追加されたため、Railsだけでなく純粋なルビーでもenumerable使用できるようになります。array.sum

于 2016-06-09T08:38:59.183 に答える
19

多様性のために、配列が数値の配列ではなく、数値(例:金額)であるプロパティを持つオブジェクトの配列である場合にも、これを行うことができます。

array.inject(0){|sum,x| sum + x.amount}
于 2013-07-24T14:23:14.050 に答える
18

ルビー1.8.7の方法は次のとおりです。

array.inject(0, &:+) 
于 2011-06-22T15:56:41.163 に答える
5

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
于 2016-12-19T12:20:18.753 に答える
4

nil値の配列の場合、コンパクトにしてから合計を注入できます。

a = [1,2,3,4,5,12,23.45,nil,23,nil]
puts a.compact.inject(:+)
于 2018-05-03T04:36:13.120 に答える
3

また、以下を可能にし[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
于 2011-01-30T08:06:13.670 に答える
2

ゴルフのように感じるなら、あなたはすることができます

eval [123,321,12389]*?+

これにより、文字列 "123 + 321 + 12389"が作成され、関数evalを使用して合計が計算されます。これはゴルフ目的のみであり、適切なコードで使用しないでください。

于 2016-11-27T20:24:11.467 に答える
2

方法1:

    [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

方法2:

   [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 `+'

方法3:

   [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: 配列にnilと空の値が含まれている場合、デフォルトで上記の関数を使用すると、reduce、sum、injectすべてが

TypeError:nilを整数に強制変換することはできません

あなたはこれを克服することができます、

   [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

方法6: 評価

文字列内の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+
于 2018-02-01T11:51:57.813 に答える
-1

簡単な方法でもできます

def sum(numbers)
  return 0 if numbers.length < 1
  result = 0
  numbers.each { |num| result += num }
  result
end
于 2014-12-12T14:27:45.437 に答える
-10

次のように.map.sumを使用できます。

array.map { |e| e }.sum
于 2015-07-23T20:16:29.503 に答える