Gegeben:
a1 = [5, 1, 6, 14, 2, 8]
Ich möchte feststellen, ob es alle Elemente enthält von:
a2 = [2, 6, 15]
In diesem Fall ist das Ergebnis false
.
Gibt es integrierte Ruby / Rails-Methoden, um eine solche Array-Aufnahme zu identifizieren?
Eine Möglichkeit, dies zu implementieren, ist:
a2.index{ |x| !a1.include?(x) }.nil?
Gibt es einen besseren, besser lesbaren Weg?
ruby-on-rails
arrays
ruby
Mischa Moroshko
quelle
quelle
Antworten:
quelle
(a2-a1).empty?
(a2.uniq - a1.uniq).empty?
Vielleicht ist das leichter zu lesen:
Sie können auch die Array-Schnittmenge verwenden:
Beachten Sie, dass dies
size
hier nur aus Geschwindigkeitsgründen verwendet wird. Sie können dies auch tun (langsamer):Aber ich denke, der erste ist besser lesbar. Diese 3 sind einfach rubinrot (keine Schienen).
quelle
Dies kann dadurch erreicht werden
Dadurch wird der Schnittpunkt beider Arrays erstellt, wobei alle Elemente zurückgegeben werden, von
a2
denen sich auch in befindeta1
. Wenn das Ergebnis dasselbe ist wiea2
, können Sie sicher sein, dass alle Elemente enthalten sinda1
.Dieser Ansatz funktioniert nur, wenn sich alle Elemente in
a2
erster Linie voneinander unterscheiden. Wenn es Doppel gibt, schlägt dieser Ansatz fehl. Der von Tempos funktioniert dann immer noch, daher empfehle ich seinen Ansatz von ganzem Herzen (auch ist er wahrscheinlich schneller).quelle
length
Methode wird viel besserWenn es keine doppelten Elemente gibt oder Sie sich nicht darum kümmern, können Sie die Set- Klasse verwenden:
Hinter den Kulissen verwendet dies
quelle
Sie können die Array-Klasse mit Affen patchen:
Prüfung
Natürlich kann die Methode als Standard-Alone-Methode geschrieben werden, z
und Sie können es wie aufrufen
In der Tat ist die folgende Version nach der Profilerstellung viel schneller und der Code ist kürzer.
quelle
Abhängig davon, wie groß Ihre Arrays sind, können Sie einen effizienten Algorithmus O (n log n) in Betracht ziehen.
Das Sortieren der Kosten O (n log n) und das Überprüfen jedes Paares kostet O (n), daher ist dieser Algorithmus O (n log n). Die anderen Algorithmen können mit unsortierten Arrays nicht schneller (asymptotisch) sein.
quelle
Die meisten Antworten, die auf (a1 - a2) oder (a1 & a2) basieren, würden nicht funktionieren, wenn in einem der Arrays doppelte Elemente vorhanden sind. Ich bin hier angekommen, um herauszufinden, ob alle Buchstaben eines Wortes (aufgeteilt in ein Array) Teil einer Reihe von Buchstaben sind (zum Beispiel für Scrabble). Keine dieser Antworten hat funktioniert, aber diese:
quelle