如何創建一個用於在Ruby中對數組元素進行求和的新數組?如何在ruby中對數組元素進行求和?
[1,2,3,4,5].each_cons(2).map {|a, b| a + b }
給我[3, 5, 7, 9]
但期望的結果是[1,3,6,10,15]
。
如何創建一個用於在Ruby中對數組元素進行求和的新數組?如何在ruby中對數組元素進行求和?
[1,2,3,4,5].each_cons(2).map {|a, b| a + b }
給我[3, 5, 7, 9]
但期望的結果是[1,3,6,10,15]
。
[1, 2, 3, 4, 5].each_with_object([]){|e, a| a.push(a.last.to_i + e)}
# => [1, 3, 6, 10, 15]
這不是很優雅,但它似乎工作:
[1,2,3,4,5].each_with_object([]){|i,l| l<<(l.last||0)+i}
#=> [1,3,6,10,15]
@MuratUstuntas這是瘋了(除此之外,這不是一個勝利者,重新檢查你的基準。)在選擇合適的解決方案時,半個納秒的差異應該無關緊要。 – mudasobwa
我同意@mudasobwa:你的基準測試基本上表明,' 在這些實現之間沒有很大的統計差異。因此,只能根據所用方法的代碼可讀性和熟悉程度來選擇。 –
是的,你是對的..我只是說一個字。如果我犯了一個錯誤,請原諒我。 :) –
很多方法可以做到這一點。一種方法是創建一個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]
'(sum + n).tap&y.method(:<<)' – mudasobwa
@mudasobwa,是的,這是個好主意。 –
另一個變化:
> [1, 2, 3, 4, 5].reduce([]) {|acc, el| acc << el + (acc[-1] || 0); acc}
#=> [1, 3, 6, 10, 15]
育。
如果使用inject/reduce並且必須在塊內的第二個語句中返回一個對象,這意味着您可能可以使用each_with_object。 –
⇑歡迎,PHP的! – mudasobwa
是的,只是老學校的解決方案.. :) –
@MuratUstuntas「到位」是什麼意思? – Stefan