2016-06-25 124 views
2

我有一個數組,看起來像這樣:從另一個陣列創建一個數組

Array_1 = ["A1", "A2", "A3", "A4", "A5", "B1", "B2", "B3", ..., "Z5"] 

我想創建"A5"後到來的Array_1的元素的數組:

Array_2 = ["B1", "B2", "B3", ..., "Z5"] 

我有一種醜陋的方式,減去兩個數組來創建第三個數組,但我覺得這肯定是一種優雅的ruby方式,應該很簡單。任何幫助將是驚人的。

回答

7
Array_1 = ["A1", "A2", "A3", "A4", "A5", "B1", "B2", "B3", "Z5"] 

Array_1[Array_1.index("A5")+1..-1] 
    # => ["B1", "B2", "B3", "Z5"] 

(我想我們應該首先計算idx = Array_1.index("A5"),以確保它的非空。)

。 。 。

另一種方式是利用Ruby的很少使用flip-flop運營商:

Array_1.select { |e| e=="A5" .. false ? true : false }[1..-1] 
    #=> ["B1", "B2", "B3", "Z5"] 

表達仍然false直到e=="A5"true,並保持true直到下面的兩個點的表達是true。因此,

Array_1.select { |e| e=="A5" .. false ? true : false } 
    #=> ["A5", "B1", "B2", "B3", "Z5"] 

[1..-1]就是附加上而不"A5"返回此陣列。

觸發器操作者必須的條件表達式,這就是爲什麼我們可以不寫的一部分:

Array_1.select { |e| e=="A5" .. false }[1..-1] 
    #ArgumentError: bad value for range 

(對於e=="A5" .. false被視爲正常範圍)。

+0

我甚至不知道觸發器運營商存在!棒極了! – 13aal

+0

非常棒!觸發器操作員正是我所期待的!感謝您的時間和幫助! –

1

這將創建您使用正則表達式匹配使用的數組。

array = ('A1'..'Z5').to_a.reject { |el| el.match %r/[A-Z][0, 6-9]/ } 

然後使用另一個正則表達式匹配去除「A(數字)」元素。

array_2 = array.select { |el| el.match %r/[B-Z]\d/ } 

這有附加的好處,不關心順序,並可以分開他們不管。

2
Array_1.slice_when{|e| e == "A5"}.to_a.last 
# => ["B1", "B2", "B3", ..., "Z5"] 
+1

太棒了!超級甜美而短暫! –

2

這個怎麼樣?

arr = ["A1", "A2", "A3", "A4", "A5", "B1", "B2", "B3", "Z5"] 

p arr.drop_while {|s| s != "A5" }.drop(1) 
# => ["B1", "B2", "B3", "Z5"] 
+0

這太棒了!謝謝您的幫助! –

2

.slice_after需要一個參數,用於切分陣列

Array_1.slice_after("A5").to_a.last 
    => ["B1", "B2", "B3", "Z5"]