簡體   English   中英

Ruby將數組拆分為非恆定長度的子數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM