35

无论元素的顺序如何,如何检查一个数组是否是另一个数组的子集?

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

...?

a1 is a subset of a2
4

4 回答 4

67

最简单的可能是:

(a1 - a2).empty?
于 2012-05-12T21:16:02.870 回答
39

使用套装。然后你可以使用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

于 2012-05-12T21:16:02.977 回答
30

您已经拥有的数据结构是完美的,只需检查交集:

(a1 & a2) == a1

更新:讨论排列的评论很有趣且很有创意,但完全不正确,因为 Ruby 实现者预料到了这个问题,并指定结果的顺序是a1. 所以这确实有效,并将在未来继续有效。(数组是有序的数据结构,而不是集合。你不能只改变数组操作的顺序。)

我更喜欢Dave Newton的酷酷答案,但这个答案也有效,并且像 Dave 的一样,也是核心 Ruby。

于 2012-05-12T21:17:03.743 回答
3

也许速度不快,但可读性很强

def subset?(a,b)
  a.all? {|x| b.include? x}
end
于 2014-10-03T15:53:12.247 回答