not - ¿Cómo puedo verificar si una matriz de Ruby incluye uno de varios valores?
ruby in array (4)
¿Algún valor en común? puede utilizar 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 Ruby con elementos duplicados? (problema con bigramas en el coeficiente de dados)
O un snippet código rápido 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
Tengo dos matrices de Ruby y necesito ver si tienen valores en común. Podría simplemente recorrer cada uno de los valores en una matriz e incluir? () En la otra, pero estoy seguro de que hay una mejor manera. ¿Qué es? (Las matrices mantienen cadenas).
Gracias.
El uso de la intersección se ve bien, pero es ineficiente. Yo usaría "alguna?" 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á que los controles de membresía sean más rápidos. 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
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