【问题标题】:How do I slice an array in ruby into sub arrays of a specified length?如何将 ruby​​ 中的数组切片为指定长度的子数组?
【发布时间】:2017-05-20 15:01:03
【问题描述】:

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

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

【问题讨论】:

  • 不,没有。

标签: arrays ruby slice


【解决方案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]]

【讨论】:

    【解决方案2】:

    试试这个

    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]]
    猜你喜欢
    • 2015-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多