这是我的问题:
我有一个大数组,我想拆分成一个数组数组。这些子阵列必须具有由第二阵列给出的长度。
实施例
x=[*1..10]
y=[1,4,2,3]
我正在寻找output=[[1],[2,3,4,5],[6,7],[8,9,10]]
这样做有一个红宝石技巧吗?
感谢您的协助:)
答案 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]]