比较包含重复的数组元素

我试图看一个数组是否包含另一个数组的每个元素。 另外,我想说明重复项。 例如:

array = [1, 2, 3, 3, "abc", "de", "f"] 

数组包含[1,2,3,3]但不包含[2,2,“abc”] – 太多2的

我已经尝试了以下但显然没有考虑到欺骗。

 other_arrays.each { |i| array.include? i } 

此方法在两个数组上迭代一次。 对于每个数组,它会创建一个散列,其中包含每个元素的出现次数。

然后,它检查subset每个唯一元素,超subset至少有多少个元素。

 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问题的回答中找到。