我试图查看一个数组是否包含另一个数组的每个元素。另外我想考虑重复项。例如:
array = [1, 2, 3, 3, "abc", "de", "f"]
数组包含 [1, 2, 3, 3] 但不包含 [2, 2, "abc"] - 2 太多
我已经尝试了以下方法,但显然没有考虑到欺骗。
other_arrays.each { |i| array.include? i }
最佳答案
此方法对两个数组迭代一次。 对于每个数组,它都会创建一个包含每个元素出现次数的哈希值。
然后,它会检查子集中
中的每个唯一元素,超集
中至少有同样多的元素。
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)
。
关于arrays - 比较数组元素(包括重复项),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42008449/