web-dev-qa-db-ja.com

Rubyで数値の配列を合計するにはどうすればいいですか?

整数の配列があります。

例えば:

array = [123,321,12389]

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

そんなこと知ってる

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

うまくいくでしょう。

542
brainfck

これを試して:

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

RubyのEnumerable Documentationを参照してください

(注:0nilではなく空の配列で返されるようにするには、0基本ケースが必要です。)

589
zenazn

またはRuby 1.9の方法を試してください。

array.inject(0, :+)

注:0基本ケースが必要です。そうでなければnilが空の配列で返されます。

> [].inject(:+)
nil
> [].inject(0, :+)
0
789
jomey
array.reduce(0, :+)

array.inject(0, :+)と同等ですが、 reduce という用語は MapReduceプログラミングモデル の登場と共に、より一般的な用語になりつつあります。

inject reduce fold 累積 、および compress はすべて、 foldingのクラスと同義です。関数 。コードベース間の一貫性が最も重要だと思いますが、さまざまなコミュニティがあるWordを別のWordよりも優先する傾向があるため、それでも代替方法を知っていると便利です。

Map-reduceの詳細を強調するために、ここでは、その配列に何が生じるかについてもう少し寛容なバージョンを示します。

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

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

275
Evan

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

require 'activesupport'
array.sum
109
Mike Woodhouse

基本クラスをmokeypatchするのは危険です、そして今Ruby 2.4.0はそれが必要ではなく危険でもあるEnumerablesに関する合計を持っています。危険で古いバージョンのRubyを使用したい場合は、Arrayクラスに#sumを追加することができます。

class Array
  def sum
    inject(0) { |sum, x| sum + x }
  end
end

それから次のような楽しいことをしてください。

[1, 2, 3, 4].sum
53
jrhicks

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がこんな感じなのかについての詳細は この答え を見てください。

35
Eli Sadoff

多様性のためだけに、あなたの配列が数値の配列ではなく、むしろ数値である特性を持つオブジェクトの配列(例えば、amount)である場合にもこれを行うことができます。

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

Ruby 2.4以降/ Rails - array.sumすなわち[1, 2, 3].sum # => 6

Ruby 2.4以前 - array.inject(:+)またはarray.reduce(:+)

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

18
collect

Ruby 1.8.7の方法は次のとおりです。

array.inject(0, &:+) 
18
Vova

あなたは単に使用することができます:

    example = [1,2,3]
    example.inject(:+)
16
Ganesh Sagare

これで十分です[1,2,3].inject('+')

5
Mahesh Bablu

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
4
Santhosh

[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
3
grosser

nil値を持つ配列では、compactを実行してからsum exを注入することができます。

a = [1,2,3,4,5,12,23.45,nil,23,nil]
puts a.compact.inject(:+)
3
pawan kumar
array.reduce(:+)

Ranges も使えます。

(1..10).reduce(:+) returns 55
2
MulleOne

これが最短の方法です。それを試してみてください。

array.inject :+

1
Tej Poudel

方法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: / Arrayにnilと空の値が含まれている場合。デフォルトで上記の関数reduce、sum、injectionを使用すると、すべてが次のようになります

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

方法6: eval

文字列中の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+
1
Nataraja B

または、この方法を試すことができます:

def sum arr
  0 if arr.empty
  arr.inject :+
end
0
ramin
number = [1..100]

number. each do |n|

    final_number = n.sum

    puts "The sum is #{final_number}"
end

*これは私にとって新しい開発者としてはうまくいきました。 []内の値を変更して番号範囲を調整できます。

0
Madeline Young

あなたがゴルフを感じるなら、あなたはすることができます

eval([123,321,12389]*?+)

これにより、文字列 "123 + 321 + 12389"が作成され、次に関数evalを使用して合計が計算されます。これは ゴルフ目的のためだけ です、あなたは適切なコードでそれを使うべきではありません。

0
Ulysse BN