我想知道数组是否是另一个数组的有序子集:
[1,2]
是[1,2,3]
[1,3]
是[1,2,3]
[2,1]
不是[1,2,3]
我找到了一些解决方案,但每个解决方案都忽略了订单。到目前为止我看到的每个方法都忽略了数组的顺序:
[1,2,3] - [2,1] #=> [3]
[1,2,3] & [2,1] #=> [1,2]
[1,2,3].to_set.superset?([2,1].to_set) #=> true
更新 根据下面的讨论,我已经更新了我的问题。
答案 0 :(得分:9)
b == a & b
检查b
中a
是否包含相同的顺序。
换句话说:一般来说,你有B⊆A⇔B=A∩B。 Ruby的Array#&
保留了左操作数的顺序。
答案 1 :(得分:2)
a = [1,2,3]
b = [2,1]
p a.each_cons(b.size).any?{|slice| slice == b} # => false
答案 2 :(得分:1)
给定两个数组arr
和sub
,这是一种确定是否存在严格增加的索引数组indices
的方法,以便arr.values_at(*indices) == sub
。< / p>
def ordered?(arr, sub)
sub.each do |c|
i = arr.index(c)
return false if i.nil?
arr = arr[i+1..-1]
end
true
end
ordered?([1,2,3], [1,2]) #=> true
ordered?([1,2,3], [2,3]) #=> true
ordered?([1,2,3], [1,3]) #=> true
ordered?([1,2,3], [3,1]) #=> false
ordered?([1,2,5,2,4,3,4], [2,2,3]) #=> true
请注意@StefanPochmann在下面的评论中提出了一种更为紧凑的写法。