So ermitteln Sie, ob ein Array alle Elemente eines anderen Arrays enthält
Gegeben:
a1 = [5, 1, 6, 14, 2, 8]
Ich möchte feststellen, ob es enthält alle Elemente von:
a2 = [2, 6, 15]
In diesem Fall das Ergebnis ist false
.
Gibt es built-in Ruby/Rails-Methoden zu identifizieren, wie die array-Integration?
Eine Möglichkeit dies umzusetzen ist:
a2.index{ |x| !a1.include?(x) }.nil?
Ist es besser, lesbarer Weise?
Kommentar zu dem Problem
Die akzeptierten Antworten (array-Subtraktion) ist die Schnellste Lösung. Ich Benchmark alle hier: gist.github.com/bbugh/cbbde8b48cbb16286044f6893e1f2e5f
InformationsquelleAutor der Frage Misha Moroshko | 2011-09-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
InformationsquelleAutor der Antwort Geo
Vielleicht ist dies einfacher zu Lesen ist:
Können Sie auch verwenden, array Kreuzung:
Beachten Sie, dass
size
verwendet wird, ist hier nur der Geschwindigkeit, Sie kann aber auch (langsamer):Aber ich denke, die ersten mehr lesbar. Diese 3 sind plain ruby (kein rails).
InformationsquelleAutor der Antwort Pablo Fernandez
Erreicht werden kann dies durch tun
Dieser erzeugt die Schnittmenge der beiden arrays, die Rückkehr der alle Elemente aus
a2
die auch ina1
. Wenn das Ergebnis ist das gleiche wiea2
können Sie sicher sein, Sie haben alle Elemente enthalten, die ina1
.Dieser Ansatz funktioniert nur, wenn alle Elemente in
a2
sind Verschieden von einander in den ersten Platz. Wenn es verdoppelt sich dieser Ansatz schlägt fehl. Der von Tempi noch dann funktioniert, so dass ich voll und ganz empfehlen, der seinen Ansatz (auch es wahrscheinlich schneller).InformationsquelleAutor der Antwort Holger Just
Wenn es keine doppelten Elemente, oder Sie kümmern sich nicht um Sie, dann können Sie die Set Klasse:
Hinter die kulissen dieser verwendet
InformationsquelleAutor der Antwort Confusion
Je nachdem, wie groß deine arrays sind, könnten Sie erwägen, einen effizienten Algorithmus, O(n log n)
Sortieren Kosten O(n log n) und prüfen jedes paar kostet O(n) somit ist dieser Algorithmus O(n log n). Die anderen algorithmen nicht schneller (asymptotisch) mit unsortierten arrays.
InformationsquelleAutor der Antwort ayckoster
Können Sie monkey-patch die Array-Klasse:
test
Natürlich die Methode kann geschrieben werden als standard-alone-Methode, z.B.
und Sie können es aufrufen, wie
In der Tat, nach der Profilierung die folgende version ist viel schneller und der code wird kürzer.
InformationsquelleAutor der Antwort Zack Xu