根据数据中的关系对数组进行切片(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
。
我有这种形式的数组:[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
。