¿Cómo puedo verificar si una matriz de Ruby incluye uno de varios valores?
Pregunta
Tengo dos matrices de rubí, y necesito ver si tienen algún valor en común. Podría simplemente recorrer cada uno de los valores en una matriz e incluir? () En el otro, pero estoy seguro de que hay una mejor manera. ¿Qué es? (Las matrices de retención de las dos cuerdas).
Gracias.
Solución
Establecer intersectar a ellos:
a1 & a2
Aquí hay un ejemplo:
> a1 = [ 'foo', 'bar' ]
> a2 = [ 'bar', 'baz' ]
> a1 & a2
=> ["bar"]
> !(a1 & a2).empty? # Returns true if there are any elements in common
=> true
Otros consejos
¿Algún valor en común? Puede usar el operador de intersección: &
[ 1, 1, 3, 5 ] & [ 1, 2, 3 ] #=> [ 1, 3 ]
Sin embargo, si está buscando una intersección completa (con duplicados), el problema es más complejo, ya hay un desbordamiento de pila aquí: ¿Cómo devolver una intersección de matriz de Ruby con elementos duplicados? (Problema con BigRams en el coeficiente de dados)
O un rápido retazo que define "real_intersection" y valida la siguiente prueba
class ArrayIntersectionTests < Test::Unit::TestCase
def test_real_array_intersection
assert_equal [2], [2, 2, 2, 3, 7, 13, 49] & [2, 2, 2, 5, 11, 107]
assert_equal [2, 2, 2], [2, 2, 2, 3, 7, 13, 49].real_intersection([2, 2, 2, 5, 11, 107])
assert_equal ['a', 'c'], ['a', 'b', 'a', 'c'] & ['a', 'c', 'a', 'd']
assert_equal ['a', 'a', 'c'], ['a', 'b', 'a', 'c'].real_intersection(['a', 'c', 'a', 'd'])
end
end
Usar la intersección se ve bien, pero es ineficiente. Yo usaría "¿alguno?" en la primera matriz (de modo que la iteración se detiene cuando uno de los elementos se encuentra en la segunda matriz). Además, el uso de un conjunto en la segunda matriz hará las verificaciones de membresía rápidamente. es decir:
a = [:a, :b, :c, :d]
b = Set.new([:c, :d, :e, :f])
c = [:a, :b, :g, :h]
# Do a and b have at least a common value?
a.any? {|item| b.include? item}
# true
# Do c and b have at least a common value?
c.any? {|item| b.include? item}
#false
Prueba esto
a1 = [ 'foo', 'bar' ]
a2 = [ 'bar', 'baz' ]
a1-a2 != a1
true