如何将ruby中的数组分片成指定长度的子数组?

How do I slice an array in ruby into sub arrays of a specified length?

我想将一个数组拆分为指定长度的子数组。

我知道 .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 中是否有一种方法可以根据您提供的参数将数组切成不同的指定长度?

试试这个

a = [1,2,3,4,5,6,7,8,9,10]
slices = [1,2,3,4].map { |n| a.shift(n) }

这会将数组切成片

注意,这会改变原始数组。

我看不出如何改进@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]]