2017-01-05 87 views
4

我有以下陣列分割一個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()最有效等效於什麼?

+1

我真的不明白的問題還沒有,但在一般情況下,如果你處理樹形像結構一樣,遞歸往往是最好的通用解決方案。 –

+0

請閱讀「[問]」,包括鏈接的頁面以及「[mcve]」。沒有代碼,它看起來像你要求我們寫一個教程或爲你寫代碼,這兩者都不是主題。 –

+0

這似乎是'Array'的複雜使用。我會考慮在**解析**時是否有更合適的數據類型,而不是將數組轉換爲嵌套數組。不知道這將消耗很難建議。但我會考慮使用對象來構建樹結構。例如。每行都變成它自己的對象,並知道它的父對象和子對象。欣賞你也需要保持順序,這可以使用子對象作爲對象數組來完成。 –

回答

4

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

+0

不知何故,我正在考慮這個確切的方法,並沒有正確應用它。接得好。 – tadman

+0

完美,謝謝!不知道我在文檔中錯過了這種方法。 – DJK

0

由於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+/

+0

約旦擊敗你; 'slice_before'是我所需要的。我試圖在沒有ActiveSupport的情況下完成它,但這仍然非常有用。謝謝! – DJK