Wie kann ein Array * auf diese Weise * schnell abgeflacht werden?
Ich habe vor einiger Zeit eine ähnliche Frage gestellt. Es wurde gefragt, wie ich ein Array wie folgt drehen kann:
[[1,2,3],[4,5,6],[7,8,9]]
dazu:
[1,2,3,4,5,6,7,8,9]
Aber jetzt möchte ich das gleiche Array auf diese drehen:
[1,4,7,2,5,8,3,6,9]
Angenommen, alle Subarrays haben die gleiche Länge.
Wenn Sie es noch nicht bemerkt haben, sind die ersten drei Elemente im Ergebnis das erste Element der drei Unterfelder. Das vierte, fünfte und sechste Element im Ergebnis ist das zweite Element jedes Subarrays.
Wenn du es immer noch nicht verstehst, hilft das vielleicht:
Original Array:
[
[1,2,3],
[4,5,6],
[7,8,9]
]
Ergebnis
[
1,4,7,
2,5,8,
3,6,9
]
Im Moment habe ich das:
func flatten(array: [[Int]]) -> [Int] {
var flat = [Int]()
for i in 0..<array[0].count {
for subarray in array {
flat.append(subarray[i])
}
}
return flat
}
Ich denke nicht, dass das sehr swfity ist. Wie kann ich das schnell erledigen?
Nur um zu vermeiden, ein XY-Problem zu sein, hier ist der Grund, warum ich das tun möchte.
Ich entwickle ein Brettspiel. Ich benutzeHLGridNode
(Es ist im Grunde ein paar Quadrate in einem gitterartigen Layout) von HLSpriteKit als Brett des Brettspiels. Um den Inhalt des Gitterknotens zu bearbeiten, muss ein 1D-Array von Sprite-Knoten übergeben werden, kein 2D-Array.
Um mir das Leben zu erleichtern, habe ich die Modellobjekte in einem 2D-Array gespeichert. Auf diese Weise kann ich auf die Quadrate 5 von links und 2 von oben verweisen, indem ich einfach Folgendes mache:
modelObjects[5][2]
Wenn ich das 2D-Array mit @ abflac.flatMap { $0 }
und übergebe das Ergebnis an den Grid Node,modelObjects[5][2]
scheint 2 Quadrate von links und 5 Quadrate von oben zu sein.
Dies ist kein Duplikat vonDie weil diese Frage eine bestimmte Anzahl von Arrays zu bearbeiten scheint. Obwohl ich mein 2D-Array in eine Schleife setzen kann und dieseenumerate().map {...}
Zeug, es scheint ein wirklich langwieriger Ansatz. Ich denke, es muss einfacher sein, dies mit 2D-Arrays zu tun.