563 Stimmen

Wie kann man in Ruby ein Array zu einem anderen Array hinzufügen, ohne dass das Ergebnis mehrdimensional ist?

Ich habe es versucht:

somearray = ["some", "thing"]
anotherarray = ["another", "thing"]
somearray.push(anotherarray.flatten!)

Ich erwartete

["some", "thing", "another", "thing"]

aber bekam

["some", "thing", nil]

10voto

Datt Punkte 703

Nur eine andere Art, es zu tun.

[somearray, anotherarray].flatten
=> ["some", "thing", "another", "thing"]

8voto

Ziggy Punkte 21056

Die Frage lautet im Wesentlichen: "Wie verkettet man Arrays in Ruby". Die Antwort ist natürlich die Verwendung von concat ou + wie in fast jeder Antwort erwähnt.

Eine natürliche Erweiterung der Frage wäre "wie man zeilenweise Verkettung von 2D-Arrays in Ruby durchführen". Als ich nach "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 für die Nachwelt hinterlassen.


In einigen Anwendungen möchten Sie vielleicht zwei 2D-Arrays zeilenweise "verketten". Etwa so,

[[a, b], | [[x],    [[a, b, x],
 [c, d]] |  [y]] =>  [c, d, y]]

Das ist so etwas wie die "Vergrößerung" einer Matrix. Ich habe diese Technik zum Beispiel verwendet, um aus einer Reihe kleinerer Matrizen eine einzige Adjazenzmatrix zu erstellen, die einen Graphen darstellt. Ohne diese Technik hätte ich die Komponenten in einer Weise iterieren müssen, die fehleranfällig oder frustrierend gewesen wäre. Vielleicht hätte ich eine each_with_index zum Beispiel. Stattdessen habe ich kombiniert zip y abflachen. wie folgt,

# given two multi-dimensional arrays that you want to concatenate row-wise
m1 = [[:a, :b], [:c, :d]]
m2 = [[:x], [:y]]

m1m2 = m1.zip(m2).map(&:flatten)
# => [[:a, :b, :x], [:c, :d, :y]]

6voto

somearray = ["some", "thing"]
anotherarray = ["another", "thing"]
somearray + anotherarray # => ["some", "thing", "another", "thing"]
somearray.concat anotherarray # => ["some", "thing", "another", "thing"]
somearray.push(anotherarray).flatten # => ["some", "thing", "another", "thing"]
somearray.push *anotherarray # => ["another", "thing", "another", "thing"]

5voto

ScottJ Punkte 1020

Ich bin überrascht, dass niemand erwähnt hat reduce was gut funktioniert, wenn Sie ein Array von Arrays haben:

lists = [["a", "b"], ["c", "d"]]
flatlist = lists.reduce(:+)  # ["a", "b", "c", "d"]

5voto

Wenn die neuen Daten ein Array oder ein Skalar sein könnten und Sie verhindern wollen, dass die neuen Daten verschachtelt werden, wenn es sich um ein Array handelt, ist der Splat-Operator großartig! Er gibt einen Skalar für einen Skalar und eine ungepackte Liste von Argumenten für ein Array zurück.

1.9.3-p551 :020 > a = [1, 2]
 => [1, 2] 
1.9.3-p551 :021 > b = [3, 4]
 => [3, 4] 
1.9.3-p551 :022 > c = 5
 => 5 
1.9.3-p551 :023 > a.object_id
 => 6617020 
1.9.3-p551 :024 > a.push *b
 => [1, 2, 3, 4] 
1.9.3-p551 :025 > a.object_id
 => 6617020 
1.9.3-p551 :026 > a.push *c
 => [1, 2, 3, 4, 5] 
1.9.3-p551 :027 > a.object_id
 => 6617020

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X