Как переносить 2D-массив элегантно в Swift [duplicate]

Чтобы добавить к вышеуказанным пунктам. Использование ArrayList в 64-битной операционной системе занимает 2x память, чем использование в 32-битной операционной системе. Между тем, общий список List будет использовать значительно меньшую память, чем ArrayList.

, например, если мы используем ArrayList из 19 МБ в 32-битной, в 64-битной системе потребуется 39 МБ. Но если у вас есть общий список List из 8 МБ в 32-битном, он будет принимать только 8,1 МБ в 64-битной версии, что составляет 481% разницу по сравнению с ArrayList.

Источник: ArrayList против общего списка для примитивных типов и 64-битных

1
задан Community 23 May 2017 в 12:15
поделиться

2 ответа

Вот улучшение на ответ 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) }
4
ответ дан Alexander 18 August 2018 в 10:36
поделиться
  • 1
    Более swifty =) – Shadow Of 6 October 2016 в 09:23
  • 2
    Это не Swifty, пока он не появится в Extension;) – Alexander 6 October 2016 в 09:24
  • 3
    Когда я попытался написать расширение, я рассердился. Пытается использовать map, что привело к «ошибке сегментации». без видимых причин, пытается использовать indicies, вызванные раздражающими «невыполненными индексами». Наконец, я получаю эту рабочую версию. Я знаю, как записать его в swift 2, но вот в быстрых 3 он выглядит настолько уродливым. Можете ли вы посмотреть мой обновленный ответ и, возможно, указать на некоторые ошибки или сделать это более простым? – Shadow Of 6 October 2016 в 11:34
  • 4
    Позвольте мне нанести удар, позже – Alexander 6 October 2016 в 17:37
  • 5
    Учитывая, что OP хочет, чтобы 2D-массив сглаживался, а также транспонировался, вы могли просто изменить первый map на flatMap - и затем вернуться [T];) – Hamish 6 October 2016 в 21:48

Вы можете получить результат, который вы хотите, перенести свою 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]]
1
ответ дан Shadow Of 18 August 2018 в 10:36
поделиться
  • 1
    Старайтесь избегать 0 ..< array.count. Вы можете просто использовать array.indices. Посмотрите на мое улучшение моего ответа. – Alexander 6 October 2016 в 09:06
  • 2
    Если вы создаете расширение для Array, вы должны просто добавить ограничение Element.Indices.Iterator.Element == Element.Index (см. этот Q & amp; A ) и просто использовать реализацию @ AlexanderMomchliov для расширения (замените matrix с self). – Hamish 6 October 2016 в 21:47
Другие вопросы по тегам:

Похожие вопросы: