根据数据中的关系对数组进行切片(Ruby)

Slicing arrays based on relations in the data (in Ruby)

我有这种形式的数组:[1, 2, 1, 4, 5, 4, 1, 7, 7, 6],我需要将它们切成类似 [[1, 2, 1], [4, 5, 4], [1], [7, 7, 6]] 的形式,其中中断由大于 1 的连续对之间的绝对差值决定。

Ruby 中是否有我可以利用的魔法,或者我是否不得不编写一个普通的旧迭代代码?

您可以使用 Enumerable#slice_when:

a = [1, 2, 1, 4, 5, 4, 1, 7, 7, 6]
a.slice_when { |i, j| (i - j).abs > 1 }.to_a
#=> [[1, 2, 1], [4, 5, 4], [1], [7, 7, 6]]

以下将适用于 Ruby v1.9+:

arr = [1, 2, 1, 4, 5, 4, 1, 7, 7, 6]

arr[1..-1].each_with_object([[arr.first]]) do |e,a|
  ((a.last.last-e).abs > 1) ? a << [e] : a[-1] << e
end
  #=> [[1, 2, 1], [4, 5, 4], [1], [7, 7, 6]] 

如果需要支持早期版本,可以使用reduce而不是each_with_object