Quel est le moyen le plus efficace de tester si un tableau contient un élément d'un deuxième tableau?
Deux exemples ci-dessous, qui tentent de répondre à la question, foods
contiennent un élément de 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?
: La méthode renvoie true si le bloc retourne toujours une valeur autre que fausse ou nulle.empty?
: Renvoie vrai si self ne contient aucun élément.(cheeses & foods).any?
non plus pourquoi la réponse n'est pas la question du PO: s'il y a des aliments dans les fromages? Dans son exemple, "feta" est dans les deux, donc le résultat devrait être vrai, non? Alors pourquoi vérifier.empty?
l'intersection?[false, false, false]
, alors qu'il n'est évidemment pas vide.Que diriez-vous de Enumerable # any?
Script de référence:
Résultat:
la source
cheeses
en un ensemble.any?, include?
était le plus rapide, disjoint le plus lent: gist.github.com/jaredmoody/d2a1e83de2f91fd6865920cd01a8b497Vous pouvez vérifier si l'intersection est vide.
la source
la source
disjoint?
c'est très élégant, surtout par rapport à "any ?, include?". La question initiale posait à la fois l'élégance et l'efficacité..to_set
méthode peut être utile icicheeses.to_set.disjoint?(foods.to_set)
la source