2016-11-22 467 views
2

如何創建一個用於在Ruby中對數組元素進行求和的新數組?如何在ruby中對數組元素進行求和?

[1,2,3,4,5].each_cons(2).map {|a, b| a + b } 

給我[3, 5, 7, 9]但期望的結果是[1,3,6,10,15]

+0

⇑歡迎,PHP的! – mudasobwa

+0

是的,只是老學校的解決方案.. :) –

+0

@MuratUstuntas「到位」是什麼意思? – Stefan

回答

1
[1, 2, 3, 4, 5].each_with_object([]){|e, a| a.push(a.last.to_i + e)} 
# => [1, 3, 6, 10, 15] 
+0

非常感謝你:)真的最快的答案.. –

+0

'to_i'導致失敗,例如,字符串。 – mudasobwa

+3

'#to_i'肯定是有'nil.to_i'返回'0'的約定。只針對數字。 –

0

這不是很優雅,但它似乎工作:

[1,2,3,4,5].each_with_object([]){|i,l| l<<(l.last||0)+i} 
#=> [1,3,6,10,15] 
+0

@MuratUstuntas這是瘋了(除此之外,這不是一個勝利者,重新檢查你的基準。)在選擇合適的解決方案時,半個納秒的差異應該無關緊要。 – mudasobwa

+0

我同意@mudasobwa:你的基準測試基本上表明,' 在這些實現之間沒有很大的統計差異。因此,只能根據所用方法的代碼可讀性和熟悉程度來選擇。 –

+0

是的,你是對的..我只是說一個字。如果我犯了一個錯誤,請原諒我。 :) –

2

很多方法可以做到這一點。一種方法是創建一個Enumerator實例,並使用inject

def adder array 
    enum = Enumerator.new do |y| 
    array.inject (0) do |sum, n| 
     y << sum + n 
     sum + n 
    end 
    end 
    enum.take array.size 
end 

adder [1,2,3,4,5] #=> [1, 3, 6, 10, 15] 
+1

'(sum + n).tap&y.method(:<<)' – mudasobwa

+0

@mudasobwa,是的,這是個好主意。 –

1

另一個變化:

> [1, 2, 3, 4, 5].reduce([]) {|acc, el| acc << el + (acc[-1] || 0); acc} 
#=> [1, 3, 6, 10, 15] 

育。

+1

如果使用inject/reduce並且必須在塊內的第二個語句中返回一個對象,這意味着您可能可以使用each_with_object。 –

8

更簡單的理解,我認爲:

temp_sum = 0 
arr.map! {|e| temp_sum += e } 
=> [1, 3, 6, 10, 15] 

如果你想創建一個新的數組,而不是現有的,只是使用map代替map!

+1

到目前爲止,第一個答案回答了「原地」問題的一部分。它有一個產生N個和的缺點,但它可以用'.with_object(temporary_sum)'修復。 – mudasobwa

+0

@mudasobwa,修正:) – Ilya

+1

很好的答案。 .... – sawa

相關問題