我希望将一个数组分成指定长度的子数组。
我知道.each_slice可以将一个数组切割成等长的子数组,剩余部分保留如下:
a = [1,2,3,4,5,6,7,8,9,10]
a.each_slice(3).to_a => [[1,2,3],[4,5,6],[7,8,9],[10]]
然而,假设我想要这样的输出:
=> [[1],[2,3],[4,5,6],[7,8,9,10]]
在Ruby中,是否有一种方法可以根据给定的参数将数组切片成不同指定长度的部分?
我希望将一个数组分成指定长度的子数组。
我知道.each_slice可以将一个数组切割成等长的子数组,剩余部分保留如下:
a = [1,2,3,4,5,6,7,8,9,10]
a.each_slice(3).to_a => [[1,2,3],[4,5,6],[7,8,9],[10]]
=> [[1],[2,3],[4,5,6],[7,8,9,10]]
试试这个
a = [1,2,3,4,5,6,7,8,9,10]
slices = [1,2,3,4].map { |n| a.shift(n) }
这将数组分成多个片段。
注意,这会改变原始数组。
slices = [1,2,3,4].map { |n| [1,2,3,4,5,6,7,8,9,10].shift(n) }
#输出是 - [[1], [1, 2], [1, 2, 3], [1, 2, 3, 4]]
- hancho我看不出如何改进@akuhn的答案,但这里有几种其他可用的方法。
a = [1,2,3,4,5,6,7,8,9,10,11]
slice_sizes = [1,2,3,4]
#1 切出薄片
def variable_slice(a, slice_sizes)
last = 0
slice_sizes.each_with_object([]) do |n,arr|
arr << a[last,n]
last += n
end
end
variable_slice(a, slice_sizes)
#=> [[1], [2, 3], [4, 5, 6], [7, 8, 9, 10]]
#2 使用递归
def variable_slice(a, slice_sizes)
return [] if slice_sizes.empty?
i, *rest = slice_sizes
[a.first(i)].concat variable_slice(a[i..-1], rest)
end
variable_slice(a, slice_sizes)
#=> [[1], [2, 3], [4, 5, 6], [7, 8, 9, 10]]