Frage

Ich habe zwei Ruby -Arrays und muss sehen, ob sie gemeinsame Werte haben. Ich könnte einfach jeden Werte in einem Array durchschleifen und einschließen? () Auf dem anderen, aber ich bin sicher, es gibt einen besseren Weg. Was ist es? (Die Arrays halten beide Saiten.)

Vielen Dank.

War es hilfreich?

Lösung

Setzen Sie Kreuzung Sie:

a1 & a2

Hier ist ein Beispiel:

> a1 = [ 'foo', 'bar' ]
> a2 = [ 'bar', 'baz' ]
> a1 & a2
=> ["bar"]
> !(a1 & a2).empty? # Returns true if there are any elements in common
=> true

Andere Tipps

Irgendein Wert gemeinsam? Sie können den Kreuzungsoperator verwenden: &

[ 1, 1, 3, 5 ] & [ 1, 2, 3 ]   #=> [ 1, 3 ]

Wenn Sie jedoch nach einer vollständigen Kreuzung suchen (mit Duplikaten), ist das Problem komplexer, hier gibt es bereits einen Stapelüberlauf: Wie kann ich einen Ruby -Array -Kreuzung mit doppelten Elementen zurückgeben? (Problem mit Bigrams im Würfelkoeffizienten)

Oder ein schnelles Snippet Dies definiert "real_intersection" und validiert den folgenden Test

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

Die Verwendung von Kreuzung sieht gut aus, ist aber ineffizient. Ich würde "irgendwelche" verwenden? Auf dem ersten Array (so dass die Iteration aufhört, wenn eines der Elemente im zweiten Array gefunden wird). Durch die Verwendung eines Sets im zweiten Array wird die Mitgliedschaftsprüfungen schnell durchführen. dh:

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

Versuche dies

a1 = [ 'foo', 'bar' ] 
a2 = [ 'bar', 'baz' ]
a1-a2 != a1
true
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top