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

检查一个数组是否是Ruby中另一个数组的子集,ruby,Ruby,如何检查一个数组是否是另一个数组的子集,而不考虑元素的顺序 a1 = [3, 6, 4] a2 = [1, 2, 3, 4, 5, 6, 7, 8, 9] ...? a1 is a subset of a2 最简单的可能是: (a1 - a2).empty? 使用集合。然后你可以使用。例如: require 'set' a1 = Set[3,6,4] a2 = Set[1,2,3,4,5,6,7,8,9] puts a1.subset?(a2) 输出: true 真的 在线查看它的

如何检查一个数组是否是另一个数组的子集,而不考虑元素的顺序

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

...?

a1 is a subset of a2
最简单的可能是:

(a1 - a2).empty?

使用集合。然后你可以使用。例如:

require 'set'

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

puts a1.subset?(a2)
输出:

true 真的
在线查看它的工作情况:

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

(a1 & a2) == a1
更新:讨论置换的评论很有趣,也很有创意,但是非常不正确,因为Ruby实现者预见到了这个问题,并指定结果的顺序是
a1
。因此,这确实有效,并将在未来继续有效。(数组是有序的数据结构,而不是集合。不能只排列数组操作的顺序。)


我确实很喜欢Dave的答案“酷”,但这个答案也很有效,就像Dave的答案一样,也是核心Ruby。

也许不快,但可读性很强

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

哦,就在十字路口检查一下。我没有想到,lolI不确定我的是否真的更好,因为这取决于实现是否稳定。(同样没有重复项,但问题作为集合运算的定义似乎暗示了这一点。我认为可以对两个术语进行排序。)我意识到这个答案已经有将近4年的历史了,但这并不一定有效
a1&a2
将给出a1的排列,如果元素的顺序不同,将其与a1进行比较时将给出false。例如,
a1=%w(ac);a2=%w(a、b、c);perm=a1和a2;(可给出[c',a]);perm==a1=>false
。保证工作的是
a1.permutation.include?(a1和a2)
@istrasci,核心文档指定从原始数组保留顺序。这确实可以正常工作,将来还会继续,因为此行为是
数组上
方法规范的一部分。
因此也不需要对结果进行排序。哦,哪种结构。最好的可能是集合,因为集合擅长于此——但正如各种各样的答案所显示的(还有更多的选项),这可能无关紧要——取决于你的需要。a1或a2中是否有重复的?如果a1中可能有重复项,a2中是否必须有相同数量或更多的重复项?换句话说,如果变量的值为
a1=[1,1]
a2=[1,2,3,4,5,6,7,8,9]
,那么结果应该是什么?目前我不希望重复,但我想我最终会使用包含重复值的集合,而实际上我想说“重复不重要”。这会导致数组出现问题吗?Set的另一个优点是,如果您不希望相同的集合返回true,您还可以检查其他属性,例如
property\u subset?
。这是纯ruby,不需要
require“Set”
Set
是stdlib,因此,可以说使用列表差异并不是那么纯粹。这是正确的答案,因为它可以防止新对象的初始化和内存阻塞。此处仅创建相交。
x.in?b
也可与ActiveSupport配合使用。()