Ruby - 数组A是否包含数组B的所有元素

时间:2011-05-04 22:45:23

标签: ruby-on-rails ruby arrays

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

8 个答案:

答案 0 :(得分:17)

你可以试试这个

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

(a-b).empty?

如果你的情况是[1,2,2] != [1,2],你可以:

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

答案 1 :(得分:7)

这应该适合您的需要:

(a & b) == b

答案 2 :(得分:6)

您可以使用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

答案 3 :(得分:5)

我更喜欢这样做:(b - a).blank?#告诉b包含在

答案 4 :(得分:4)

最简单的方法是:

(b-a).empty?

答案 5 :(得分:2)

还有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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

希望对某人有帮助!