是否有任何方法來獲取兩個值之間的數組中的元素?查找兩個元素之間的數組中的所有元素
例子:
arr = ["abc", "AGC", "xxx", "tcv", "car", "kiss"]
## After some operation..
arr # => ["AGC", "xxx", "tcv", "car"]
如何讓有能力的新陣列"AGC"
和"car"
之間的要素是什麼?
是否有任何方法來獲取兩個值之間的數組中的元素?查找兩個元素之間的數組中的所有元素
例子:
arr = ["abc", "AGC", "xxx", "tcv", "car", "kiss"]
## After some operation..
arr # => ["AGC", "xxx", "tcv", "car"]
如何讓有能力的新陣列"AGC"
和"car"
之間的要素是什麼?
如果你有信心,他們倆都是那麼現在你應該能夠做到這一點:
a = ["abc", "AGC", "xxx", "tcv", "car", "kiss"]
a[(a.index('abc')+1)..a.index('car')]
# => ["AGC", "xxx", "tcv", "car"]
我有同樣的解決方案,但使用逗號'a [a.index(「abc」)+ 1,a.index(「car」)]' –
@philipyoo只有當'abc'位於位置'0 '。在'xxx'上試試。第二個參數是以'a,b'形式表示的長度。微妙但重要。 – tadman
啊,很高興不知道這件事。謝謝! –
你可以使用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
也''(s ==「AGC」.. s ==「汽車」)'得到更強烈一點。 – tadman
@tadman,我不知道那會奏效。我做了一個編輯。謝謝。 (讀者:我以前在塊中有'== first..s == last?true:false') –
@tadman,在反思中我決定回滾到原來的樣子,因爲我認爲它可能更容易由不熟悉觸發器操作員的讀者理解。 –
您可以使用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"]
如果我從'things'中刪除''car'',它會返回'[「AGC」,「xxx」,「tcv」,「kiss」,「car」]',如果'things = ['abc','car','xxx','tcv','AGC','kiss']'返回'[「AGC」,「kiss」,「car」]'。 OP可能暗含的「事物」包含「AGC」和「car」,依次處理不好的數據。如果閱讀正常並且效率很高,那麼應該向上看。 –
@CarySwoveland,如果兩者中的一個不在陣列中,那麼在兩者之間採取元素**意味着什麼是有問題的。至於他們是否交換,你是正確的。這假定你知道這個命令。儘管我可以使用'#slice_between'來修復它,但它變得更醜陋。 – ndn
您可以用一個簡單的數據檢查作爲開頭,這個數據檢查最容易通過將其封裝在一個方法中來顯示。 –
另一種愚蠢的方式。
假定元素都是字符串和一定的角色,說"@"
,不包括在內。
arr.join("@")[/(?<[email protected])[email protected][email protected]([email protected])/].split("@")
# => ["AGC", "xxx", "tcv", "car"]
這裏的@ 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')
#=> []
使用的優點是不需要額外的push
或drop
,並且如果first
和last
不存在或者排序良好,則返回的方法ns是一個空數組。
這裏有一個相關的問題:"Ruby split lines from files while iterating each line"
請閱讀 「[問]」 和 「[MCVE]」。我們希望看到您嘗試解決這個問題。沒有你的努力的證據,它看起來像你沒有嘗試,並希望我們爲你寫。 –
數組中的值是否始終按順序排列? –
'arr'是否可以包含重複項?如果是,如果'arr = ['abc','AGC','xxx','car','yyy','car','kiss']'應該返回什麼? –