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.

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top