Ruby-将数组拆分为非常长的子数组

时间:2018-03-21 11:08:24

标签: arrays ruby

这是我的问题:

我有一个大数组,我想拆分成一个数组数组。这些子阵列必须具有由第二阵列给出的长度。

实施例

x=[*1..10]

y=[1,4,2,3]

我正在寻找output=[[1],[2,3,4,5],[6,7],[8,9,10]]

这样做有一个红宝石技巧吗?

感谢您的协助:)

3 个答案:

答案 0 :(得分:7)

您可以尝试shift,它会为您提供数组中的第一个元素,从一开始就将其删除。

a = [1,2,3,4]
a.shift
# 1
a
# [2,3,4]

它还需要一个参数来换掉数组。

a = [1,2,3,4]
a.shift(2)
# [1,2]
a
# [3,4]

所以你的阵列......

x = [1,2,3,4,5,6,7,8,9,10]
y = [1,4,2,3]

z = y.map do |length|
  x.shift(length)
end 

z
# [[1], [2, 3, 4, 5], [6, 7], [8, 9, 10]] 
    带有参数的
  • shift将返回从数组开头取出的那么多元素的数组。与此相反的是pop,它以相同的方式工作,但从数组的末尾获取元素。
  • map将遍历数组,如each,但会将每次迭代的结果放入一个新数组中。
  • 所以迭代你的长度数组,我们将从数组中抓取前几个。

附录:一些评论者表示担心此方法会改变初始变量。 (在此过程之后,x将是一个emtpy数组,因为它已全部移出)。

如果您需要在分割后再次使用x,则可以使用dup来保留完整的副本。

x2 = x.dup
x2
# [1,2,3,4,5,6,7,8,9,10]

z = y.map do |length|
  x2.shift(length)
end 

x
# [1,2,3,4,5,6,7,8,9,10]
x2
# []

答案 1 :(得分:2)

您可以将slice!方法与数组初始化程序块一起使用:

x = (1..10).to_a    # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [1, 4, 2, 3]
c = Array.new(y.length) {|i| x.slice!(0...y[i])}    # [[1], [2, 3, 4, 5], [6, 7], [8, 9, 10]]

map,正如@Stefan指出的那样:

c = y.map { |i| x.slice!(0, i) }

答案 2 :(得分:-1)

使用显式枚举器。

enumx = x.each
enumy = y.each

Array.new(y.size) { enumy.next.times.with_object([]) { |_, o| o << enumx.next } }
 #=> [[1], [2, 3, 4, 5], [6, 7], [8, 9, 10]]

为了提高可读性,我们可以将其包装在一个方法中。

def taker n, enum
  n.times.with_object([]) { |_, o| o << enum.next }
end

enumx = x.each
enumy = y.each

Array.new(y.size) { taker enumy.next, enumx }
 #=> [[1], [2, 3, 4, 5], [6, 7], [8, 9, 10]]