我有以下陣列分割一個Ruby陣列分成不相等的尺寸的子陣列:如何使用分隔符
arr = [0, 1, 1, 2, 3, 1, 0, 0, 1]
在不改變值的順序,我需要在每次發生細分arr
成更小的陣列0
,這樣的結果將是:
arr = [ [0, 1, 1, 2, 3, 1], [0], [0, 1] ]
如果arr
是一個字符串,我可以用.split("0")
,然後在前面加上分隔符給各子陣列。對於數組中的普通Ruby,.split()
最有效等效於什麼?
我有以下陣列分割一個Ruby陣列分成不相等的尺寸的子陣列:如何使用分隔符
arr = [0, 1, 1, 2, 3, 1, 0, 0, 1]
在不改變值的順序,我需要在每次發生細分arr
成更小的陣列0
,這樣的結果將是:
arr = [ [0, 1, 1, 2, 3, 1], [0], [0, 1] ]
如果arr
是一個字符串,我可以用.split("0")
,然後在前面加上分隔符給各子陣列。對於數組中的普通Ruby,.split()
最有效等效於什麼?
Enumerable#slice_before
做這個確切的事情:
arr = [0, 1, 1, 2, 3, 1, 0, 0, 1]
p arr.slice_before(0).to_a
# => [[0, 1, 1, 2, 3, 1], [0], [0, 1]]
看到它在repl.it:https://repl.it/FBhg
由於ActiveSupport defines an Array#split method in Ruby,我們可以使用它作爲一個起點:
class Array
def split(value = nil)
arr = dup
result = []
if block_given?
while (idx = arr.index { |i| yield i })
result << arr.shift(idx)
arr.shift
end
else
while (idx = arr.index(value))
result << arr.shift(idx)
arr.shift
end
end
result << arr
end
end
# then, using the above to achieve your goal:
arr = [0, 1, 1, 2, 3, 1, 0, 0, 1]
arr.split(0).map { |sub| sub.unshift(0) }
# => [[0], [0, 1, 1, 2, 3, 1], [0], [0, 1]]
請注意,您的算法(分割和前置)的言語措辭是正在發生的事情在這裏,但你的預期輸出是不同的(有由於split
的工作方式,附加零)。
是否要每個零點前分開?爲此,您可以使用slice_before
。
是否要拆分,但刪除空陣列?這可以在預先確定之前使用快速compact
完成,但是您將丟失[0]
子陣列。
是否要拆分,但刪除第一個元素如果爲空?
是否要拆分/0+/
?
約旦擊敗你; 'slice_before'是我所需要的。我試圖在沒有ActiveSupport的情況下完成它,但這仍然非常有用。謝謝! – DJK
我真的不明白的問題還沒有,但在一般情況下,如果你處理樹形像結構一樣,遞歸往往是最好的通用解決方案。 –
請閱讀「[問]」,包括鏈接的頁面以及「[mcve]」。沒有代碼,它看起來像你要求我們寫一個教程或爲你寫代碼,這兩者都不是主題。 –
這似乎是'Array'的複雜使用。我會考慮在**解析**時是否有更合適的數據類型,而不是將數組轉換爲嵌套數組。不知道這將消耗很難建議。但我會考慮使用對象來構建樹結構。例如。每行都變成它自己的對象,並知道它的父對象和子對象。欣賞你也需要保持順序,這可以使用子對象作爲對象數組來完成。 –