【问题标题】:Check if an array is subset of another array in Ruby检查一个数组是否是Ruby中另一个数组的子集
【发布时间】:2012-05-20 23:58:21
【问题描述】:

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

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

...?

a1 is a subset of a2

【问题讨论】:

  • 哦,哪个结构。最好的可能是集合,因为集合最擅长的是——但随着答案的多样性(还有更多选择)显示,这可能并不重要——取决于您的需求。
  • a1 或 a2 中可以有重复项吗?如果a1中可以有重复项,a2中是否必须有相同数量或更多的重复项?换句话说,如果您的变量具有值a1 = [1, 1]a2 = [1,2,3,4,5,6,7,8,9],结果应该是什么?
  • 目前我不希望重复,但我想我最终会使用包含重复值的集合,我实际上想说“重复无关紧要”。这会导致数组出现问题吗?

标签: ruby


【解决方案1】:

最简单的可能是:

(a1 - a2).empty?

【讨论】:

  • 这是纯红宝石,不需要require "set"
  • set 是stdlib,因此可以说它没有使用列表差异那么纯粹。
  • 这是正确的答案,因为它可以防止新对象的初始化和内存的阻塞。这里只创建了相交。
【解决方案2】:

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

【讨论】:

  • Set 的另一个优点是,如果您不希望相同的集合返回 true,您还可以检查其他属性,例如 proper_subset?
【解决方案3】:

你已经拥有的数据结构已经很完美了,只要检查一下交集:

(a1 & a2) == a1

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

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

【讨论】:

  • 哦,走路口看看就好。没想到哈哈
  • 我不确定我的是否真的更好,因为这取决于实现是排序稳定的。 (同样没有重复,但将问题定义为集合操作似乎暗示了这一点。我想可以对这两个术语进行排序。)
  • 我意识到这个答案已经快 4 年了,但这并不一定有效。 a1 & a2 将给出 a1 的 排列,如果元素的顺序不同,则在将 == 与 a1 进行比较时将给出 false。例如,a1=%w(a c); a2= %w(a b c); perm=a1&a2; (may give ['c','a']); perm==a1 => false。保证工作的是a1.permutation.include?(a1&a2)
  • @istrasci,核心文档在 ruby-doc.org/core-2.3.1/Array.html#method-i-26 指定 订单从原始数组中保留。 这确实可以正常工作并将继续这样做 将来,因为此行为是 Array.& 方法规范的一部分,因此也没有必要对结果进行排序。
【解决方案4】:

也许不快,但可读性很好

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

【讨论】:

猜你喜欢
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-13
  • 2021-07-10
  • 2020-03-10
  • 2012-08-29
相关资源
最近更新 更多