somearray = ["some", "thing"]
anotherarray = ["another", "thing"]
somearray.push(anotherarray.flatten!)
Ich erwartete
["some","thing","another","thing"]
ruby
arrays
multidimensional-array
ncvncvn
quelle
quelle
ri Array@flatten!
Warum bekommt diese Frage so viele Stimmen? Das Dokument ist explizitArray#flatten!
Flattens self in place. Gibt null zurück, wenn keine Änderungen vorgenommen wurden (dh das Array enthält keine Subarrays.)flatten!
es so nicht funktioniert. Schließlich spiegelt die Frage eher ein logisches Problem als ein Optimierungsproblem wider. Weitere Informationen finden Sie in der Antwort von Pilcrow weiter unten.Antworten:
Sie haben eine praktikable Idee, aber das
#flatten!
ist an der falschen Stelle - es seinen Empfänger verflacht, so dass Sie, um sie nutzen könnten[1, 2, ['foo', 'bar']]
in[1,2,'foo','bar']
.Ich vergesse zweifellos einige Ansätze, aber Sie können verketten :
oder voranstellen / anhängen :
oder Spleiß :
oder anhängen und abflachen :
quelle
Array#concat
ordnet kein neues Array zu, Verkettung mitArray#+
tutSie können einfach den
+
Operator verwenden!Sie können alles über die Array-Klasse hier lesen: http://ruby-doc.org/core/classes/Array.html
quelle
a+= b
erstellt ein neues Array:c = a = [1,2] ; b = [3,4] ; a += b ; puts c #=> [1,2]
push
die von @pilcrow beschriebene Methode ansehen.+=
ein neues Objekt erstellt wird. In diesem Beispiel wird ein[1, 2].each_with_object([]) { |number, object| object+=number }
leeres Array[]
zurückgegebenDer sauberste Ansatz ist die Verwendung der Array # concat- Methode. Es wird kein neues Array erstellt (im Gegensatz zu Array # +, das dasselbe tut, aber ein neues Array erstellt).
Direkt aus den Dokumenten ( http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-concat ):
Damit
Array # concat reduziert ein mehrdimensionales Array nicht, wenn es als Argument übergeben wird. Sie müssen das separat behandeln:
Zuletzt können Sie unser Corelib-Juwel ( https://github.com/corlewsolutions/corelib ) verwenden, das den Ruby- Kernklassen nützliche Helfer hinzufügt. Insbesondere haben wir eine Array # add_all- Methode, die mehrdimensionale Arrays automatisch reduziert, bevor der Concat ausgeführt wird.
quelle
Einfache Methode, die mit Ruby Version> = 2.0 funktioniert, aber nicht mit älteren Versionen:
quelle
*
hier passiert ?[*a, *b]
schlägt für ältere Versionen von Ruby fehl, dh 1.8.7. Und so sehr Ruby Ihnen auch sagen möchte, dass es nicht mehr im Leben ist, RHEL6 wird weiterhin beibehalten, was Ruby 1.8 zu einer bedeutenden Zielversion macht.[...array1, ...array2]
, sehr ähnlich ist. Denken Sie nur daran, dass dersplat
Operator in Ruby*
anstelle von wäre...
. Es macht es leichter, sich zu erinnernVersuchen Sie dies, es kombiniert Ihre Arrays und entfernt Duplikate
http://www.ruby-doc.org/core/classes/Array.html
Weitere Dokumentation unter "Set Union"
quelle
array1 |= [ "foo1", "bar1" ] #=> [ "foo", "bar", "foo1", "bar1" ]
Hier sind zwei Möglichkeiten: Beachten Sie in diesem Fall, dass die erste Möglichkeit ein neues Array zuweist (übersetzt in somearray = somearray + anotherarray).
quelle
So hängen Sie das Ergebnis
b
ana
und speichern es ina
:oder
In beiden Fällen
a
wird:Im ersteren Fall werden die Elemente von
b
an das vorhandenea
Array angehängt , und im letzteren Fall werden die beiden Arrays miteinander verkettet und das Ergebnis in gespeicherta
.quelle
a.push(*b)
nicht genau das gleiche ist wiea += b
. Ersteres fügt die neuen Elemente dem vorhandenen Array hinzu. Letzterer erstellt ein neues Array mit allen Elementen und weist es zua
. Sie können den Unterschied erkennen, wenn Sieaa = a
den Verweisa
vor dem Anhängen einer Methode speichern und anschließend untersuchenaa
. Im ersteren Fall ändert es sich mit dem neuen Wert vona
und im letzteren bleibt es unverändert.(array1 + array2).uniq
Auf diese Weise erhalten Sie zuerst array1-Elemente. Sie erhalten keine Duplikate.
quelle
Bei der Ausarbeitung der Antwort von @ Pilcrow ist die einzige geeignete Antwort für große Arrays
concat
(+
), da sie schnell ist und kein neues Objekt zuweist, das beim Betrieb innerhalb einer Schleife durch Müll gesammelt werden soll.Hier ist der Benchmark:
Ergebnisse:
Wie Sie mit einem
push
Wurf sehen können, gibt es einen FEHLER :stack level too deep (SystemStackError)
Wenn die Arrays groß genug sind.quelle
Die Frage ist im Wesentlichen, wie Arrays in Ruby verkettet werden. Natürlich ist die Antwort zu verwenden
concat
oder+
wie in fast jeder Antwort erwähnt.Eine natürliche Erweiterung der Frage wäre "wie eine zeilenweise Verkettung von 2D-Arrays in Ruby durchgeführt wird". Als ich "Ruby Concatenate Matrices" googelte, war diese SO-Frage das Top-Ergebnis, also dachte ich, ich würde meine Antwort auf diese (nicht gestellte, aber verwandte) Frage hier der Nachwelt überlassen.
In einigen Anwendungen möchten Sie möglicherweise zwei 2D-Arrays zeilenweise "verketten". Etwas wie,
Dies ist so etwas wie das "Erweitern" einer Matrix. Mit dieser Technik habe ich beispielsweise eine einzelne Adjazenzmatrix erstellt, um einen Graphen aus einer Reihe kleinerer Matrizen darzustellen. Ohne diese Technik hätte ich die Komponenten auf eine Weise durchlaufen müssen, die fehleranfällig oder frustrierend gewesen wäre. Ich hätte
each_with_index
zum Beispiel eine machen müssen. Stattdessen habe ich Reißverschluss und Abflachung wie folgt kombiniert :quelle
Nur eine andere Art, es zu tun.
quelle
flatten
glättet alles so weit wie möglich, rekursiv. Sogar verschachtelte Arrays. Wenn verschachtelte Arrays enthaltensomearray
oderanotherarray
enthalten, werden sie folglich auch abgeflacht. Dies ist eine Nebenwirkung, die normalerweise nicht beabsichtigt ist.["some", "thing"] + ["another" + "thing"]
quelle
[*a] + [*b]
funktioniert"another" + "thing"
das wie erwartet funktionieren wird.Wenn die neuen Daten ein Array oder ein Skalar sein könnten und Sie verhindern möchten, dass die neuen Daten verschachtelt werden, wenn es sich um ein Array handelt, ist der Splat-Operator fantastisch! Es gibt einen Skalar für einen Skalar und eine entpackte Liste von Argumenten für ein Array zurück.
quelle
Ich bin überrascht, dass niemand erwähnt hat
reduce
, was gut funktioniert, wenn Sie eine Reihe von Arrays haben:quelle
Dies wird keine Dups entfernen, aber
Entfernt Dups.
quelle
Ich finde es einfacher, Arrays zu verschieben oder anzuhängen und sie dann wie folgt zu glätten:
quelle
somearray = ["etwas", "Ding"]
anotherarray = ["ein anderes", "Ding"]
Somearray + Anotherarray
quelle