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

MxL*_*evs 25 ruby

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

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

...?

a1 is a subset of a2
Run Code Online (Sandbox Code Playgroud)

Dav*_*ton 41

最简单的可能是:

(a1 - a2).empty?
Run Code Online (Sandbox Code Playgroud)

  • `set` 是 stdlib,因此可以说它不如使用列表差异那么纯粹。 (2认同)
  • 这是正确的答案,因为它可以防止新对象的初始化和内存堵塞。这里仅创建相交。 (2认同)

Mar*_*ers 34

使用集.然后你可以使用set.subset?.例:

require 'set'

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

puts a1.subset?(a2)
Run Code Online (Sandbox Code Playgroud)

输出:

true

看到它在线工作:ideone

  • Set 的另一个优点是,如果您不希望相同的集合返回 true,您还可以检查其他属性,例如 `proper_subset?`。 (2认同)

Dig*_*oss 24

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

(a1 & a2) == a1
Run Code Online (Sandbox Code Playgroud)

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

我更喜欢Dave Newton对于酷感的回答,但这个答案也有效,就像Dave一样,也是核心Ruby.