我正在尝试查看一个数组是否包含另一个数组的每个元素。另外,我想考虑重复项。例如:
array = [1, 2, 3, 3, "abc", "de", "f"]
数组包含 [1, 2, 3, 3] 但不包含 [2, 2, "abc"] - 2 太多
我已经尝试了以下内容,但显然没有考虑到欺骗。
other_arrays.each { |i| array.include? i }
此方法对两个数组迭代一次。对于每个数组,它创建一个哈希,其中包含每个元素的出现次数。
然后它检查对于subset
中的每个唯一元素,superset
中至少有同样多的元素。
class Array
def count_by
each_with_object(Hash.new(0)) { |e, h| h[e] += 1 }
end
def subset_of?(superset)
superset_counts = superset.count_by
count_by.all? { |k, count| superset_counts[k] >= count }
end
end
[1, 2, 3, 3, "abc", "de", "f"].count_by
#=> {1=>1, 2=>1, 3=>2, "abc"=>1, "de"=>1, "f"=>1}
[1, 2, 3, 3].count_by
#=> {1=>1, 2=>1, 3=>2}
[1, 2, 3, 3].subset_of? [1, 2, 3, 3, "abc", "de", "f"]
#=> true
[2, 2, "abc"].subset_of? [1, 2, 3, 3, "abc", "de", "f"]
#=> false
如果您不想修补Array
类,则可以定义:
count_by(array)
和subset_of?(array1, array2)
.
您可以先为类创建一个有用的实例方法Array
:
class Array
def difference(other)
h = other.each_with_object(Hash.new(0)) { |e,h| h[e] += 1 }
reject { |e| h[e] > 0 && h[e] -= 1 }
end
end
然后,如果以下方法返回 true
,则数组a
的所有元素都包含在数组b
中。
def subarray?(a,b)
a.difference(b).empty?
end
例如
subarray? [1,2,3], [1,4,"cat",3,2]
#=> true
subarray? [1,2,3], [1,4,"cat",3,5]
#=> false
我发现Array#difference
应用如此广泛,所以我建议将其添加到Ruby核心中。有关该方法及其用途的详细信息可以在链接中找到,也可以在我对这个SO问题的回答中找到。