2017-02-02 4 views
2

Я пытаюсь увидеть, содержит ли массив каждый элемент другого массива. Кроме того, я хочу учитывать дубликаты. Например:Сравнение элементов массива, включая дубликаты

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

массив содержит [1, 2, 3, 3], но не содержит [2, 2, "а"] - слишком много 2-х

Я пробовал ниже, но, очевидно, Безразлично Не принимайте во внимание обманов.

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

Аналогичным образом используется .all? метод 'other_arrays.all? {| Х | array.include? x} ' –

ответ

3

Этот метод повторяет один раз по обеим массивам. Для каждого массива он создает хеш с количеством вхождений каждого элемента.

Затем он проверяет, что для каждого уникального элемента в 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).

0

Вы можете сначала создать полезный метод экземпляра для класса 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 

Тогда все элементы массива a содержатся в массиве b, если следующий метод возвращает true.

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 имеет такое широкое применение, что я proposed, что он будет добавлен к ядру Ruby. Подробности о методе и его использовании можно найти по ссылке, а также в моем ответе на вопрос this SO.

Смежные вопросы