2017-05-19 84 views
1

是否有任何方法來獲取兩個值之間的數組中的元素?查找兩個元素之間的數組中的所有元素

例子:

arr = ["abc", "AGC", "xxx", "tcv", "car", "kiss"] 

## After some operation.. 
arr # => ["AGC", "xxx", "tcv", "car"] 

如何讓有能力的陣列"AGC""car"之間的要素是什麼?

+0

請閱讀 「[問]」 和 「[MCVE]」。我們希望看到您嘗試解決這個問題。沒有你的努力的證據,它看起來像你沒有嘗試,並希望我們爲你寫。 –

+0

數組中的值是否始終按順序排列? –

+0

'arr'是否可以包含重複項?如果是,如果'arr = ['abc','AGC','xxx','car','yyy','car','kiss']'應該返回什麼? –

回答

5

如果你有信心,他們倆都是那麼現在你應該能夠做到這一點:

a = ["abc", "AGC", "xxx", "tcv", "car", "kiss"] 

a[(a.index('abc')+1)..a.index('car')] 
# => ["AGC", "xxx", "tcv", "car"] 
+0

我有同樣的解決方案,但使用逗號'a [a.index(「abc」)+ 1,a.index(「car」)]' –

+1

@philipyoo只有當'abc'位於位置'0 '。在'xxx'上試試。第二個參數是以'a,b'形式表示的長度。微妙但重要。 – tadman

+1

啊,很高興不知道這件事。謝謝! –

5

你可以使用Ruby的flip-flop operator

def extract(arr, first, last) 
    return nil unless ([first, last]-arr).empty? && arr.index(first) <= arr.index(last) 
    arr.select { |s| s==first..s==last ? true : false } 
end 

arr = ["abc", "AGC", "xxx", "tcv", "car", "kiss"] 

extract(arr, 'AGC', 'car') 
    #=> ["AGC", "xxx", "tcv", "car"] 
extract(arr, 'car', 'car') 
    #=> ["car"] 
extract(arr, 'AGC', 'dog') 
    #=> nil 
extract(arr, 'car', 'AGC') 
    #=> nil 
+0

也''(s ==「AGC」.. s ==「汽車」)'得到更強烈一點。 – tadman

+1

@tadman,我不知道那會奏效。我做了一個編輯。謝謝。 (讀者:我以前在塊中有'== first..s == last?true:false') –

+0

@tadman,在反思中我決定回滾到原來的樣子,因爲我認爲它可能更容易由不熟悉觸發器操作員的讀者理解。 –

3

您可以使用Array#drop_while/Array#take_while。請注意,這將導致一次性的,因此需要推底:

things = ['abc', 'AGC', 'xxx', 'tcv', 'car', 'kiss'] 

things. 
    drop_while { |thingy| thingy != 'AGC' }. 
    take_while { |thingy| thingy != 'car' }. 
    push('car') 
    # => ["AGC", "xxx", "tcv", "car"] 

或者:

things. 
    slice_before { |thingy| thingy == 'AGC' }.to_a.last. 
    slice_after { |thingy| thingy == 'car' }.first 
    # => ["AGC", "xxx", "tcv", "car"] 
+0

如果我從'things'中刪除''car'',它會返回'[「AGC」,「xxx」,「tcv」,「kiss」,「car」]',如果'things = ['abc','car','xxx','tcv','AGC','kiss']'返回'[「AGC」,「kiss」,「car」]'。 OP可能暗含的「事物」包含「AGC」和「car」,依次處理不好的數據。如果閱讀正常並且效率很高,那麼應該向上看。 –

+0

@CarySwoveland,如果兩者中的一個不在陣列中,那麼在兩者之間採取元素**意味着什麼是有問題的。至於他們是否交換,你是正確的。這假定你知道這個命令。儘管我可以使用'#slice_between'來修復它,但它變得更醜陋。 – ndn

+0

您可以用一個簡單的數據檢查作爲開頭,這個數據檢查最容易通過將其封裝在一個方法中來顯示。 –

2

這裏的@ NDN的答案的變化,用2個reverse S:

def extract(arr, first, last) 
    arr.reverse.drop_while{ |x| x != last }.reverse.drop_while{ |x| x != first } 
end 

arr = %w[abc AGC xxx tcv car kiss] 

p extract(arr, 'AGC', 'car') 
#=> ["AGC", "xxx", "tcv", "car"] 
p extract(arr, 'car', 'car') 
#=> ["car"] 
p extract(arr, 'AGC', 'dog') 
#=> [] 
p extract(arr, 'car', 'AGC') 
#=> [] 

使用的優點是不需要額外的pushdrop,並且如果firstlast不存在或者排序良好,則返回的方法ns是一個空數組。

這裏有一個相關的問題:"Ruby split lines from files while iterating each line"

+0

不錯。其實,如果你用'![first,last] .include替換'x!= last' /'x!= first'? x'你也可以處理@Cary的擔憂(如果你不知道哪個值是第一個,該怎麼辦)。 – ndn

+0

@ndn。謝謝。儘管如此,你仍然需要更多的邏輯,以確保你不會使用相同的邊界兩次。 'extract(%w(a b c d e f g a),'a','x')'應該返回nil或空數組。 –

+0

我有點擔心它應該返回'nil'或'[]'。它聽起來沒有比其他任何東西更正確。但是你有一個觀點,認爲它不能正確表達提取(%w(a b x a),'a','x')'。 – ndn

相關問題