¿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, foodscontienen 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
cheesesen 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_setEl método puede ser útil aquícheeses.to_set.disjoint?(foods.to_set)fuente