如何在Ruby中将一个数组切片成指定长度的子数组?

3

我希望将一个数组分成指定长度的子数组。

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

没有,没有任何的。 - Zepplock
2个回答

5

试试这个

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

这将数组分成多个片段。

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


这个很好用!我今天更深入地研究了一下,有另一个问题。您能告诉我为什么如果我不将数组[1,2,3,4,5,6,7,8,9,10]设置为变量,而是执行以下操作 -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

1

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接