Wie kann ich überprüfen, ob ein Ruby -Array einen von mehreren Werten enthält?
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.
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