假設我有一個這樣的陣列:
arr=[["1"], ["1"], ["2", "2"], ["2.1", "0.8"], ["2.2", "0.2"],
["1"], ["2", "3"], ["2", "0.8"], ["2", "0.4"], ["1"], ["2"],
["1", "0.8"], ["2", "0.4"], ["3", "0.3"]]
即,一系列長度為 1 的子串列(1 個或更多)后跟一系列長度大于 1 的子串列(1 個或更多)。
我想將該串列分為:
[[["1"], ["1"], ["2", "2"], ["2.1", "0.8"], ["2.2", "0.2"]],
[["1"], ["2", "3"], ["2", "0.8"], ["2", "0.4"]],
[["1"], ["2"], ["1", "0.8"], ["2", "0.4"], ["3", "0.3"]]]
即,長度為 1 的子串列與以下長度大于 1 的子串列組合成這些子串列的單個子串列。
這有效:
data = []
while arr.length > 0
tmp = []
while arr.length > 0 && arr[0].length() == 1
tmp << arr.shift
end
while arr.length > 0 && arr[0].length() > 1
tmp << arr.shift
end
data << tmp
end
p data
# [[["1"], ["1"], ["2", "2"], ["2.1", "0.8"], ["2.2", "0.2"]], [["1"], ["2", "3"], ["2", "0.8"], ["2", "0.4"]], [["1"], ["2"], ["1", "0.8"], ["2", "0.4"], ["3", "0.3"]]]
但這似乎超級笨拙。是否有一個.groupby或觸發器或某種形式的 Ruby 列舉器我想更容易地做到這一點?
uj5u.com熱心網友回復:
作為對@dawg 答案的改進,如果我們傳遞給的塊:slice_when檢查長度b是否大于長度a:
data = arr.slice_when { |a, b| b.length < a.length }.to_a
結果是:
[[["1"], ["1"], ["2", "2"], ["2.1", "0.8"], ["2.2", "0.2"]],
[["1"], ["2", "3"], ["2", "0.8"], ["2", "0.4"]],
[["1"], ["2"], ["1", "0.8"], ["2", "0.4"], ["3", "0.3"]]]
這只正確處理陣列具有長度1或2. 為了使它更健壯,我們可以檢查我們是否只在b有 length時才這樣做1。
data = arr.slice_when { |a, b| b.length == 1 && b.length < a.length }.to_a
現在,如果:
arr = [["1"], ["1"], ["2", "2"], ["2.1", "0.8"], ["2.2", "0.2"], ["1", "3", "4"], ["1", "1"],
["1"], ["2", "3"], ["2", "0.8"], ["2", "0.4"], ["1"], ["2"],
["1", "0.8"], ["2", "0.4"], ["3", "0.3"]]
結果是:
[[["1"], ["1"], ["2", "2"], ["2.1", "0.8"], ["2.2", "0.2"], ["1", "3", "4"], ["1", "1"]],
[["1"], ["2", "3"], ["2", "0.8"], ["2", "0.4"]],
[["1"], ["2"], ["1", "0.8"], ["2", "0.4"], ["3", "0.3"]]]
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/456267.html
