[英]Ruby- split array into subarrays of non-constant length
這是我的問題:
我有一個大數組,我想拆分成一個數組數組。 這些子數組的長度必須由第二個數組指定。
例
x=[*1..10]
y=[1,4,2,3]
我正在尋找output=[[1],[2,3,4,5],[6,7],[8,9,10]]
有紅寶石技巧可以做到這一點嗎?
謝謝你的協助 :)
您可以嘗試進行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將是一個空數組,因為它已全部移出)。
如果將x
拆分后需要再次使用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
# []
您可以使用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) }
使用顯式枚舉器。
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]]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.