Ich habe folgenden Code:
a = ["Cat", "Dog", "Mouse"]
s = ["and", "&"]
Ich möchte das Array s
in ein Array zusammenführen, a
das mir Folgendes geben würde:
["Cat", "and", "Dog", "&", "Mouse"]
Wenn ich mir die Ruby Array- und Enumerable-Dokumente ansehe, sehe ich keine solche Methode, mit der dies erreicht werden kann.
Gibt es eine Möglichkeit, dies zu tun, ohne jedes Array zu durchlaufen?
Antworten:
Sie können das tun mit:
quelle
a
mehr als 3 Elemente vorhanden sind?[a, s].transpose
dass die beiden Zeilen nicht übereinstimmen, was#zip
als offensichtliche Lösung bleibt. Und ich glaube nicht, dass er meinte, dass es ihn wirklich interessierte, ob era
mutiert war ... Ich glaube nicht, dass er eine mutierte oder funktionale Lösung kommentierte, er versuchte nur, das Muster zu beschreiben.Dies ergibt kein Ergebnisarray in der von Chris angeforderten Reihenfolge, aber wenn die Reihenfolge des resultierenden Arrays keine Rolle spielt, können Sie es einfach verwenden
a |= b
. Wenn Sie nicht mutieren möchtena
, können Siea | b
das Ergebnis schreiben und einer Variablen zuweisen.Weitere Informationen finden Sie in der Dokumentation zur Set Union für die Array-Klasse unter http://www.ruby-doc.org/core/classes/Array.html#M000275 .
Diese Antwort setzt voraus, dass Sie keine doppelten Array-Elemente möchten. Wenn Sie doppelte Elemente in Ihrem endgültigen Array zulassen möchten,
a += b
sollten Sie den Trick ausführen. Wenn Sie nicht mutieren möchtena
, verwenden Sie erneuta + b
das Ergebnis und weisen Sie es einer Variablen zu.In Reaktion auf einige Kommentare auf dieser Seite funktionieren diese beiden Lösungen mit Arrays beliebiger Größe.
quelle
["Cat", "Dog", "Mouse", "and", "&"]
, was das OP nicht wollte.Wenn Sie kein Duplikat möchten, verwenden Sie einfach die Union Operator:
quelle
s
werden am Ende des neuen Arrays angezeigt.Es gibt Ihnen nicht die Reihenfolge, nach der Sie gefragt haben, aber es ist eine gute Möglichkeit, zwei Arrays durch Anhängen an das eine zusammenzuführen.
quelle
Hier ist eine Lösung, mit der mehrere Arrays unterschiedlicher Größe verschachtelt werden können (allgemeine Lösung):
quelle
Es ist nicht gerade elegant, aber es funktioniert für Arrays jeder Größe:
quelle
i = s.cycle; a.map { |x| [x, i.next] }.flatten[0..-2]
wäre jedoch genauso gültig.and
und&
deshalb nahm ich ihn so wörtlich wie möglich, wobei icha
jede Länge zuließ.Wie wäre es mit einer allgemeineren Lösung, die auch dann funktioniert, wenn das erste Array nicht das längste ist und eine beliebige Anzahl von Arrays akzeptiert?
quelle
Um die Situation zu bewältigen, in der beide
a
&s
nicht gleich groß sind:.compact
wird entfernt,nil
wenna
größer als ists
| s
fügt die verbleibenden Elemente ab dems
Zeitpunkt hinzu, an dema
kleiner als ists
quelle
Eine Möglichkeit, das Interleave durchzuführen und zu gewährleisten, welches das größte Array für die Zip-Methode ist, besteht darin, eines der Arrays
nil
bis zur anderen Arraygröße zu füllen . Auf diese Weise garantieren Sie auch, welches Element von welchem Array an erster Stelle steht:quelle
preferred_arr.zip(other_arr).flatten | other_arr
(ohne die Nullfüllung)quelle