Этот метод повторяет один раз по обеим массивам. Для каждого массива он создает хеш с количеством вхождений каждого элемента.
Затем он проверяет, что для каждого уникального элемента в 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)
.
Аналогичным образом используется .all? метод 'other_arrays.all? {| Х | array.include? x} ' –