Schienen - Suchen von Schnittpunkten zwischen mehreren Arrays

75

Ich versuche, die Schnittwerte zwischen mehreren Arrays zu finden.

zum Beispiel

code1 = [1,2,3]
code2 = [2,3,4]
code3 = [0,2,6]

Das Ergebnis wäre also 2

Ich weiß, dass Sie dies in PHP mit array_intersect tun können

Ich wollte in der Lage sein, einfach zusätzliches Array hinzuzufügen, damit ich nicht wirklich mehrere Schleifen verwenden möchte

Irgendwelche Ideen ?

Danke, Alex

Alex
quelle

Antworten:

117

Verwenden Sie die & -Methode von Array, die für die Schnittmenge festgelegt ist.

Zum Beispiel:

> [1,2,3] & [2,3,4] & [0,2,6]
=> [2]
Anurag
quelle
@ Anurag Bist du sicher, dass das funktioniert? Sofern ich die Anforderungen von OP nicht falsch verstehe, werden das erste und das letzte Array nicht auf Schnittmenge gegeneinander getestet. Gibt beispielsweise [1,2,3] & [4,5,6] & [1,2,3]ein leeres Array zurück.
Noz
2
@Cyle Jedes Element im Ergebnis einer Drei-Wege-Kreuzung sollte in allen drei Operanden vorhanden sein. Siehe en.wikipedia.org/wiki/Intersection_(set_theory)
49

Wenn Sie dies mit einem Array von Arrays unbekannter Länge einfacher machen möchten, können Sie injizieren.

> arrays = [code1,code2,code3]
> arrays.inject(:&)                   # Ruby 1.9 shorthand
=> [2]
> arrays.inject{|codes,x| codes & x } # Full syntax works with 1.8 and 1.9
=> [2]
Fotios
quelle
arrays.inject(:&)wird in 1.9 nicht funktionieren. Dies wird jedoch funktionierenarrays.inject(:'&')
Iuri G.
0

Array # -Kreuzung (Ruby 2.7+)

Ruby 2.7 führte die Array # -Kreuzungsmethode ein , um sie an die prägnantere Array # & anzupassen .

So kann jetzt [1, 2, 3] & [2, 3, 4] & [0, 2, 6]ausführlicher umgeschrieben werden, z

[1, 2, 3].intersection([2, 3, 4]).intersection([0, 2, 6])
# => [2]

[1, 2, 3].intersection([2, 3, 4], [0, 2, 6])
# => [2]
Marian13
quelle