Какой самый эффективный способ проверить, содержит ли массив какой-либо элемент из второго массива?
Два примера ниже, попытка ответить на вопрос, foods
содержит какой-либо элемент из cheeses
:
cheeses = %w(chedder stilton brie mozzarella feta haloumi reblochon)
foods = %w(pizza feta foods bread biscuits yoghurt bacon)
puts cheeses.collect{|c| foods.include?(c)}.include?(true)
puts (cheeses - foods).size < cheeses.size
any?
: Метод возвращает истину , если блок всегда возвращает значение , отличное от ложных или ноль.empty?
: Возвращает истину , если сам не содержат элементов.(cheeses & foods).any?
является вопросом OP: есть ли продукты в сырах? В его примере «фета» есть в обоих, поэтому результат должен быть правдой, верно? Так зачем проверять.empty?
перекресток?[false, false, false]
, хотя оно, очевидно, не пустое.Как насчет Enumerable # any?
Контрольный скрипт:
Результат:
источник
cheeses
в набор.any?, include?
был самым быстрым, а набор - самым медленным: gist.github.com/jaredmoody/d2a1e83de2f91fd6865920cd01a8b497Вы можете проверить, является ли пересечение пустым.
источник
источник
disjoint?
это очень элегантно, особенно по сравнению с «любой? Оригинальный вопрос задавался как об элегантности, так и эффективности..to_set
Метод может быть полезен здесьcheeses.to_set.disjoint?(foods.to_set)
источник