Ruby on rails 计算数组元素之间的差异

Ruby on rails 计算数组元素之间的差异,ruby-on-rails,ruby,Ruby On Rails,Ruby,给定n个整数的排序数组,如下所示: ary = [3, 5, 6, 9, 14] times = @messages.map{|m| m.created_at.to_i} left = times[1..times.length-1] right = times[0..times.length-2] differences = left.zip(right).map { |x| x[0]-x[1]} 我需要计算数组中每个元素和下一个元素之间的差值。通过上面的例子,我将得出以下结论: [2,

给定n个整数的排序数组,如下所示:

ary = [3, 5, 6, 9, 14]
times = @messages.map{|m| m.created_at.to_i}
left  = times[1..times.length-1]
right = times[0..times.length-2]
differences = left.zip(right).map { |x| x[0]-x[1]}
我需要计算数组中每个元素和下一个元素之间的差值。通过上面的例子,我将得出以下结论:

[2, 1, 3, 5]
开始数组中可能有0、1或多个元素,我将处理的数字将大得多(我将使用历元时间戳)。我尝试了以下方法:

ary = [3, 5, 6, 9, 14]
times = @messages.map{|m| m.created_at.to_i}
left  = times[1..times.length-1]
right = times[0..times.length-2]
differences = left.zip(right).map { |x| x[0]-x[1]}
但我上面的解决方案既不是最优的,也不是理想的。谁能帮我一把吗

>> ary = [3, 5, 6, 9, 14] #=> [3, 5, 6, 9, 14]
>> ary.each_cons(2).map { |a,b| b-a } #=> [2, 1, 3, 5]
编辑:
注入
替换为
映射

替代方案:

a.map.with_index{ |v,i| (a[i+1] || 0) - v }[0..-2]

不适用于Ruby 1.8,其中
map
需要一个块而不是返回枚举数。

类似但更简洁:

[3, 5, 6, 9, 14].each_cons(2).collect { |a,b| b-a }

这是惊人的简洁。谢谢你的回答,很好!我以前不知道每个缺点。这是一个略短的版本:
ari。每个cons(2)。map{a,b | b-a}
。作为旁注:命名抽象很重要:[(a,b),(b,c),(c,d),…]称为“成对组合”。而且确实是可枚举的。each_cons(2).map是在Ruby中实现这一点的最佳方法(多亏了枚举器,现在所有each_xyz方法都可以“从功能上”使用),如果您将
collect
替换为
map
:)则更加简洁。请注意,
each_cons
在1.8.6中不可用,但在1.8.7中可用。