Как сгладить массив * таким образом * быстро?
Я задал похожий вопрос некоторое время назад. Он спрашивал, как я могу превратить массив следующим образом:
[[1,2,3],[4,5,6],[7,8,9]]
к этому:
[1,2,3,4,5,6,7,8,9]
Но теперь я хочу превратить этот же массив в это:
[1,4,7,2,5,8,3,6,9]
Предположим, что все подмассивы имеют одинаковую длину.
Если вы еще не заметили, первые три элемента в результате - это первый элемент из трех подмассивов. Четвертый, пятый и шестой элементы в результате - это второй элемент каждого подмассива.
Если вы все еще не понимаете, возможно, это поможет:
Исходный массив:
[
[1,2,3],
[4,5,6],
[7,8,9]
]
Результат:
[
1,4,7,
2,5,8,
3,6,9
]
На данный момент у меня есть это:
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
}
Я не думаю, что это очень быстро. Как я могу сделать это быстрым способом?
Просто чтобы не быть проблемой XY, вот почему я хочу сделать это.
Я занимаюсь разработкой настольной игры. я используюHLGridNode
(Это в основном набор квадратов в виде сетки)HLSpriteKit как доска настольной игры. Чтобы редактировать содержимое узла сетки, мне нужно передать одномерный массив узлов спрайтов, а не двумерный массив.
Чтобы облегчить мою жизнь, я сохранил объекты модели в двумерном массиве. Таким образом, я могу сослаться на квадрат 5 квадратов слева и 2 квадрата сверху, выполнив:
modelObjects[5][2]
Если я сгладить 2D-массив с помощью.flatMap { $0 }
и передать результат в узел сетки,modelObjects[5][2]
Казалось бы, 2 квадрата слева и 5 квадратов сверху.
Это не дубликатэтот потому что у этого вопроса, похоже, есть определенное количество массивов для работы. Хотя я могу поместить свой 2D-массив в цикл, и сделать этоenumerate().map {...}
вещи, это похоже на действительно многословный подход. Я думаю, что должно быть проще сделать это с 2D-массивами.