Arrays 如何在ruby中就地求和数组元素?
如何在Ruby中创建一个新数组来对数组元素进行求和Arrays 如何在ruby中就地求和数组元素?,arrays,ruby,Arrays,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,
[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]
[1,2,3,4,5]。每个_与_对象([]){i,l | l有很多方法可以做到这一点。一种方法是创建一个枚举器
实例并使用注入
:
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]
def加法器阵列
enum=枚举器。新do | y|
array.inject(0)do | sum,n|
y[1,3,6,10,15]
另一种变体:
> [1, 2, 3, 4, 5].reduce([]) {|acc, el| acc << el + (acc[-1] || 0); acc}
#=> [1, 3, 6, 10, 15]
[1,2,3,4,5]。减少([]){acc,el{acc[1,3,6,10,15]
Yuk.更简单的理解,我认为:
temp_sum = 0
arr.map! {|e| temp_sum += e }
=> [1, 3, 6, 10, 15]
如果要创建新数组而不是现有数组,只需使用
map
而不是map!
如果使用inject/reduce并且必须在块内的第二条语句中返回一个对象,这意味着您可能可以将每个_与_对象一起使用。(sum+n)。点击&y.method(:@mudasobwa,是的,这是一个好主意。to_i
会导致字符串失败。to_i
当然是有约定的,即为零。to_i
返回0
。只针对数字。@mudasobwa不确定你的意思。字符串来自哪里?虽然这可能解决问题,但添加总是好的解释为什么/如何工作。@sawa数组可能由任何对象组成,在上定义了+
,我看不出有任何理由拒绝任何对象,除了数值的s。a.push(a.last?a.last+e:e)
将适用于任何对象。到目前为止,这里的第一个答案是“原地”问题的一部分。它有产生N个和的缺点,但可以用来解决。用_object(临时_sum)
@mudasobwa,fixed:)arr.each_with _object(sum:0)。map!{e,acc | acc[:sum]+=e}
@mudasobwa,这太棒了。@SunnyMagadan,通常到位
意味着变异器
。但我要补充你的评论。@MuratUstuntas这太疯狂了(除此之外,这不是赢家,重新检查你的基准测试。)在选择合适的解决方案时,半纳秒的差异应该无关紧要。我同意@mudasobwa:您的基准测试基本上表明,这些实现之间没有很大的统计差异。因此,选择只取决于(比如)代码可读性和对所用方法的熟悉程度。是的,您是对的。我只说一句话。我如果我犯了错误,请原谅我。:)⇑ 欢迎,PHP!是的,只是老派的解决方案:)@MuratUstuntas“就地”是什么意思?@Stefan,我的意思是“就地”,即您应该更新原始数组,而不是创建新数组。@MuratUstuntas在这种情况下,“我如何创建新数组”有点误导。