¿Cuál es la forma más eficiente de probar si una matriz contiene algún elemento de una segunda matriz?
Dos ejemplos a continuación, que intentan responder la pregunta, foods
contienen algún elemento 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?
: El método devuelve verdadero si el bloque siempre devuelve un valor que no sea falsa o nula.empty?
: Devuelve verdadero si self no contiene elementos.(cheeses & foods).any?
es la pregunta del OP: si hay alimentos en los quesos? En su ejemplo, "feta" está en ambos, por lo que el resultado debería ser cierto, ¿verdad? Entonces, ¿por qué verificar.empty?
en la intersección?[false, false, false]
, mientras que obviamente no está vacío.¿Qué tal Enumerable # any?
Script de referencia:
Resultado:
fuente
cheeses
en un conjunto.any?, include?
fue el más rápido disjuntos, conjunto el más lento: gist.github.com/jaredmoody/d2a1e83de2f91fd6865920cd01a8b497Puede verificar si la intersección está vacía.
fuente
fuente
disjoint?
es muy elegante, especialmente en comparación con "any? Include?". La pregunta original preguntaba tanto sobre elegante como eficiente..to_set
El método puede ser útil aquícheeses.to_set.disjoint?(foods.to_set)
fuente