是否有任何方法可以在两个值之间获取数组中的元素?
示例:
arr = ["abc", "AGC", "xxx", "tcv", "car", "kiss"]
## After some operation..
arr # => ["AGC", "xxx", "tcv", "car"]
如何在新数组中获取"AGC"
和"car"
之间的元素?
答案 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的好处是不需要额外的push
或drop
,如果first
和last
不是{0}}如果存在或排序良好,该方法返回一个空数组。
以下是相关问题:"Ruby split lines from files while iterating each line"
答案 4 :(得分:0)
另一种愚蠢的方式。
假设元素都是字符串且某个字符(例如"@"
)不包括在内,
arr.join("@")[/(?<=@)AGC@.+@car(?=@)/].split("@")
# => ["AGC", "xxx", "tcv", "car"]