在两个元素之间查找数组中的所有元素

时间:2017-05-19 01:50:51

标签: arrays ruby

是否有任何方法可以在两个值之间获取数组中的元素?

示例:

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

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

如何在数组中获取"AGC""car"之间的元素?

5 个答案:

答案 0 :(得分:5)

如果你确信他们都在场,那么你应该能够做到这一点:

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

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

答案 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 

答案 2 :(得分: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"]

答案 3 :(得分: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')
#=> []

使用2 drop_while s的好处是不需要额外的pushdrop,如果firstlast不是{0}}如果存在或排序良好,该方法返回一个空数组。

以下是相关问题:"Ruby split lines from files while iterating each line"

答案 4 :(得分:0)

另一种愚蠢的方式。

假设元素都是字符串且某个字符(例如"@")不包括在内,

arr.join("@")[/(?<=@)AGC@.+@car(?=@)/].split("@")
# => ["AGC", "xxx", "tcv", "car"]