检查数组是否是Ruby中另一个数组的子集

时间:2012-05-12 21:09:56

标签: ruby

如何判断一个数组是否是另一个数组的子集,而不管元素的顺序是什么?

a1 = [3, 6, 4]
a2 = [1, 2, 3, 4, 5, 6, 7, 8, 9]

...?

a1 is a subset of a2

4 个答案:

答案 0 :(得分:38)

最简单的可能是:

(a1 - a2).empty?

答案 1 :(得分:32)

使用套装。然后你可以使用set.subset?。例如:

require 'set'

a1 = Set[3,6,4]
a2 = Set[1,2,3,4,5,6,7,8,9]

puts a1.subset?(a2)

输出:

true

查看在线工作:ideone

答案 2 :(得分:23)

您已经拥有的数据结构非常完美,只需检查交叉点:

(a1 & a2) == a1

更新:讨论排列的评论既有趣又富有创意,但由于Ruby实现者预见到了这种担忧并且指定结果的顺序是a1的顺序,所以非常不正确。所以这确实有效,并将在未来继续发挥作用。 (数组是有序的数据结构,而不是集合。您不能只是置换数组操作的顺序。)

我更喜欢Dave Newton的冷静答案,但这个答案也有效,就像戴夫一样,也是核心Ruby。

答案 3 :(得分:1)

也许不是很快,但很可读

def subset?(a,b)
  a.all? {|x| b.include? x}
end