我只是想知道是否有一种好方法(没有循环)来查找数组相邻元素之间的差异:
[2, 8, 12] -> [6, 4]
a(n) = a(n+1) - a(n)
[2, 8, 12].each_cons(2).map{|a, b| b - a} # => [6, 4]
这仍然是几个周期,但你看不到它们。
a = [2, 8, 12]
a.map.with_index(1){|e,i| a[i]-e if a[i] }.compact # => [6, 4]
基准
require 'benchmark'
a = (1..10000000).to_a
Benchmark.bm(10) do |b|
b.report("each_cons") { a.each_cons(2).map{|a, b| b - a} }
b.report("map_with_index") { a.map.with_index(1){|e,i| a[i]-e if a[i] }.compact }
end
输出
user system total real
each_cons 38.298000 0.156000 38.454000 ( 38.561856)
map_with_index 1.435000 0.000000 1.435000 ( 1.428143)
另一种方法。不如 Arup 的方式快,但几乎:
a.zip(a.rotate).map{|x,y|y-x}.tap(&:pop)