Чтобы добавить к вышеуказанным пунктам. Использование ArrayList
в 64-битной операционной системе занимает 2x память, чем использование в 32-битной операционной системе. Между тем, общий список List
будет использовать значительно меньшую память, чем ArrayList
.
, например, если мы используем ArrayList
из 19 МБ в 32-битной, в 64-битной системе потребуется 39 МБ. Но если у вас есть общий список List
из 8 МБ в 32-битном, он будет принимать только 8,1 МБ в 64-битной версии, что составляет 481% разницу по сравнению с ArrayList.
Источник: ArrayList против общего списка для примитивных типов и 64-битных
Вот улучшение на ответ Shadow Of :
extension Collection where Self.Iterator.Element: RandomAccessCollection {
func transposed() -> [[Self.Iterator.Element.Iterator.Element]] {
guard let firstRow = self.first else { return [] }
return firstRow.indices.map { index in
self.map{ $0[index] }
}
}
}
let matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
]
matrix.transposed().forEach{ print($0) }
Вы можете получить результат, который вы хотите, перенести свою 2d-матрицу, используя, например, эту функцию:
func matrixTranspose<T>(_ matrix: [[T]]) -> [[T]] {
if matrix.isEmpty {return matrix}
var result = [[T]]()
for index in 0..<matrix.first!.count {
result.append(matrix.map{$0[index]})
}
return result
}
и применяя flatten
(joined
в swift 3).
let arr = [[1,2,3],[4,5,6],[7,8,9]]
print(matrixTranspose(arr))
// [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
print(matrixTranspose(arr).flatMap{$0})
// [1, 4, 7, 2, 5, 8, 3, 6, 9]
Версия расширения:
extension Collection where Self.Iterator.Element: Collection {
var transpose: Array<Array<Self.Iterator.Element.Iterator.Element>> {
var result = Array<Array<Self.Iterator.Element.Iterator.Element>>()
if self.isEmpty {return result}
var index = self.first!.startIndex
while index != self.first!.endIndex {
var subresult = Array<Self.Iterator.Element.Iterator.Element>()
for subarray in self {
subresult.append(subarray[index])
}
result.append(subresult)
index = self.first!.index(after: index)
}
return result
}
}
с использованием
let arr = [[1,2,3],[4,5,6],[7,8,9]]
print(arr.transpose)
// [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
0 ..< array.count
. Вы можете просто использовать array.indices
. Посмотрите на мое улучшение моего ответа.
– Alexander
6 October 2016 в 09:06
Array
, вы должны просто добавить ограничение Element.Indices.Iterator.Element == Element.Index
(см. этот Q & amp; A ) и просто использовать реализацию @ AlexanderMomchliov для расширения (замените matrix
с self
).
– Hamish
6 October 2016 в 21:47
map
, что привело к «ошибке сегментации». без видимых причин, пытается использоватьindicies
, вызванные раздражающими «невыполненными индексами». Наконец, я получаю эту рабочую версию. Я знаю, как записать его в swift 2, но вот в быстрых 3 он выглядит настолько уродливым. Можете ли вы посмотреть мой обновленный ответ и, возможно, указать на некоторые ошибки или сделать это более простым? – Shadow Of 6 October 2016 в 11:34map
наflatMap
- и затем вернуться[T]
;) – Hamish 6 October 2016 в 21:48