【问题标题】:Ruby - Does array A contain all elements of array B [duplicate]Ruby - 数组A是否包含数组B的所有元素[重复]
【发布时间】:2011-05-04 22:45:22
【问题描述】:

有什么方法可以检查数组A是否包含数组B的所有元素?

【问题讨论】:

  • 显示要比较的数组示例。你的意思是数组 A 可以包含相同数量的相同元素,或者只是相同的元素和不同的数量
  • 你在乎重复吗?例如,设 a 为 [1,2,3,4],b 为 [1,1,2]。返回值应该是多少?
  • Ruby 在 2.6 中引入了difference,它为此提供了一个完美的快速和可读的解决方案。 More info here.

标签: ruby-on-rails ruby arrays


【解决方案1】:

你可以试试这个

a.sort.uniq == b.sort.uniq

(a-b).empty?

如果 [1,2,2] != [1,2] 在您的情况下,您可以:

a.group_by{|i| i} == b.group_by{|i| i}

【讨论】:

  • (a-b).empty?+1
  • 以防万一有人在这里结束:这些都是错误的。正确答案是(b-a).empty?,而不是相反。其他人是完全错误的。另见stackoverflow.com/questions/7387937/…
  • @oseiskar 不,他们没有错。这取决于任务。
  • 我不这么认为。如果任务是回答问题数组 A 是否包含数组 B 的所有元素,这在 Ruby 中的字面意思是 B.map{|e|A.include?(e)}.all?,那么在一般情况下,这些都没有给出正确的答案(或,例如,我想出的第一个例子:A = [1,2,3], B = [1,2])。
  • @oseiskar 是的,这听起来很合理。在一般情况下,他们都错了。
【解决方案2】:

这应该可以满足您的需要:

(a & b) == b

【讨论】:

  • 这通常不会起作用。 a = [1,2,2,1,3]; b = [3,2,1]; (a & b) == b => false
  • 是的,但是a = [1,2,2,1,3]; b = [3,2,1]; (a & b).sort == b.sort => true
  • @the Tin Man,是的,但是 a = [1,2,2,1,3]; b = [3,2,2,1]; (a & b).sort == b.sort => false
  • 不需要排序只需反转二进制AND的顺序
【解决方案3】:

你可以使用 Ruby 的 Set 类:

>> require 'set' #=> true
>> a = [*1..5] #=> [1, 2, 3, 4, 5]
>> b = [*1..3] #=> [1, 2, 3]
>> a.to_set.superset? b.to_set #=> true

对于小型数组,我通常会按照 fl00r 的建议进行操作:

>> (b-a).empty? #=> true

【讨论】:

    【解决方案4】:

    我更喜欢通过:(b - a).blank? # 告诉 b 包含在 a 中

    【讨论】:

    • 更优雅谢谢!
    【解决方案5】:

    最简单的方法是这样的:

    (b-a).empty?
    

    【讨论】:

      【解决方案6】:

      还有 Set 类(标准库的一部分),它允许您检查 B 是否是 A 的子集,例如

      >> a = [1,2,3,4,5]       => [1, 2, 3, 4, 5]
      >> b = [3,4,5]           => [3, 4, 5]
      >> require 'set'         => true 
      >> set_a = a.to_set      => #<Set: {1, 2, 3, 4, 5}> 
      >> set_b = b.to_set      => #<Set: {3, 4, 5}> 
      
      >> set_b.subset? set_a   => true
      

      http://www.ruby-doc.org/stdlib/libdoc/set/rdoc/index.html

      【讨论】:

        【解决方案7】:

        您可能想查看 Ruby 标准库中的 Set 类。 proper_subset? 方法可能会做你想做的事。

        【讨论】:

          【解决方案8】:

          Ruby 2.6+

          Ruby 在 2.6 中引入了 difference 正是为了这个目的。

          非常快,非常易读,如下:

          a = [1, 2, 3, 4, 5, 6]
          b = [1, 2, 3, 4, 5, 6]
          
          a.difference(b).any?
          # => false
          a.difference(b.reverse).any?
          # => false
          
          a = [1, 2, 3, 4, 5, 6]
          b = [1, 2, 3]
          a.difference(b).any?
          # => true
          

          希望对某人有所帮助!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-14
            • 2021-06-20
            • 2013-09-26
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多