626 Stimmen

Wie summiert man ein Array von Zahlen in Ruby?

Ich habe ein Array mit ganzen Zahlen.

Zum Beispiel:

array = [123,321,12389]

Gibt es eine gute Möglichkeit, die Summe dieser Werte zu ermitteln?

Ich weiß, dass

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

funktionieren würde.

40 Stimmen

Bitte beachten Sie, dass Ruby 2.4+ die array.sum

1 Stimmen

Ruby 2.6 hat das nicht. Ruby gibt, Ruby nimmt, so scheint es.

2 Stimmen

@Lori hmm? Link

51voto

Eli Sadoff Punkte 6863

Neu für Ruby 2.4.0

Sie können die treffend benannte Methode Enumerable#sum . Es hat eine Menge Vorteile gegenüber inject(:+) aber es gibt auch einige wichtige Hinweise am Ende zu lesen.

Beispiele

Bereiche

(1..100).sum
#=> 5050

Arrays

[1, 2, 4, 9, 2, 3].sum
#=> 21

[1.9, 6.3, 20.3, 49.2].sum
#=> 77.7

Wichtiger Hinweis

Diese Methode ist nicht gleichbedeutend mit #inject(:+) . Zum Beispiel

%w(a b c).inject(:+)
#=> "abc"
%w(a b c).sum
#=> TypeError: String can't be coerced into Integer

Auch,

(1..1000000000).sum
#=> 500000000500000000 (execution time: less than 1s)
(1..1000000000).inject(:+)
#=> 500000000500000000 (execution time: upwards of a minute)

Siehe diese Antwort für weitere Informationen darüber, warum sum ist wie folgt.

22voto

typo Punkte 1041

Ruby 2.4+ / Rails - array.sum d.h. [1, 2, 3].sum # => 6

Ruby vor 2.4 - array.inject(:+) o array.reduce(:+)

*Anmerkung: Die #sum Methode ist eine neue Ergänzung zu 2.4 für enumerable so dass Sie nun in der Lage sein werden array.sum in reinem Ruby, nicht nur in Rails.

19voto

HashFail Punkte 526

Nur zur Abwechslung können Sie dies auch tun, wenn Ihr Array kein Array mit Zahlen ist, sondern ein Array mit Objekten, deren Eigenschaften Zahlen sind (z. B. Betrag):

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

18voto

Vova Punkte 309

Ruby 1.8.7 Weg ist der folgende:

array.inject(0, &:+)

6voto

Santhosh Punkte 26455

Ruby 2.4.0 wurde veröffentlicht und hat eine Aufzählbar#sum Methode. Sie können also tun

array.sum

Beispiele aus den Dokumentationen:

{ 1 => 10, 2 => 20 }.sum {|k, v| k * v }  #=> 50
(1..10).sum                               #=> 55
(1..10).sum {|v| v * 2 }                  #=> 110

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X