2D-массивы Swift: равные права для строк и столбцов

Учитывая простой 2D-массив...

let grid = [[Cell]]()

... и заполнить Cells, чтобы создать матрицу из 10 строк на 10 столбцов. Я могу получить доступ к строке 7 сетки следующим образом...

let rowSeven = grid[6]

Каков самый простой способ извлечь весь столбец 7? Я знаю, что это можно сделать, перебирая каждую строку и извлекая седьмой элемент в каждой строке, но я ищу ответ, который может одинаково обрабатывать строки и столбцы.

Я особенно открыт для идеи использования альтернативы двумерному массиву, так как в будущем я, возможно, захочу отображать и фильтровать ячейки в сетке независимо от того, в какой строке или столбце они находятся.


person Vince O'Sullivan    schedule 06.08.2017    source источник
comment
Сравните stackoverflow.com/questions/35244584/   -  person Martin R    schedule 06.08.2017
comment
Спасибо. Похоже, мне нужно получить более глубокие знания о коллекциях в Swift.   -  person Vince O'Sullivan    schedule 06.08.2017
comment
Ответ, на который вы ссылаетесь, не обрабатывает строки и столбцы одинаково (согласно моему вопросу), но добавляет расширение к коллекции, которое рассматривает столбцы как что-то принципиально отличное от строк (и просто заменяет цикл по строкам эквивалентным картографическая функция). Эта разница между строками и столбцами является чисто артефактом того, как двумерные массивы работают в Swift. Поэтому я думаю, что должна быть возможность создать модель, отражающую это. (Я просто еще не понял, как это сделать.)   -  person Vince O'Sullivan    schedule 06.08.2017
comment
Я думаю, что, возможно, значения строки и столбца должны быть свойствами ячейки, а не свойствами сетки, и что сетка должна быть просто несортированным контейнером для ячеек. Похоже, это обеспечивает гибкость (независимую от строки/столбца), которую я ищу.   -  person Vince O'Sullivan    schedule 06.08.2017
comment
Я еще не уверен, что именно вы ищете, но есть и другие реализации, моделирующие 2D-массивы, например. здесь github.com/raywenderlich/swift-algorithm-club /блоб/мастер/.   -  person Martin R    schedule 06.08.2017
comment
просто интересно, нужен ли мой ответ? еще, пожалуйста, дайте мне знать, что не так с этим.   -  person Rajamohan S    schedule 10.08.2017
comment
Спасибо за ответ @RAJAMOHAN-S. К сожалению, мой вопрос был немного расплывчатым (хотя я специально сказал, что знаю, как извлекать столбцы). Проблема, на которую я намекал, заключается в том, что двумерные массивы на самом деле не двумерные. Например, приведенный выше массив Grid представляет собой одномерный массив строк, каждая строка представляет собой одномерный массив ячеек. Чтобы извлечь столбец, необходимо посетить и извлечь ячейку из каждой строки и построить столбец, но обратное неверно. Вам не нужно посещать какие-либо столбцы, чтобы извлечь строку данных. Продолжение...   -  person Vince O'Sullivan    schedule 12.08.2017
comment
...продолжение. Мне было интересно, можно ли создать настоящую 2D-структуру, которая могла бы обрабатывать строки и столбцы таким же образом, а не так, как это делает 2D-массив. В другом ответе указывалось, что можно создать интерфейс или протокол, имитирующий настоящее 2D, но меня заинтересовала реализация.   -  person Vince O'Sullivan    schedule 12.08.2017


Ответы (1)


Я думаю, вы должны создать свой собственный тип (структуру), который представляет интерфейс, который вы ищете. Затем вы можете реализовать структуру по своему усмотрению и изменить ее в соответствии со своими потребностями, не изменяя код, использующий структуру. Я бы ожидал интерфейс вроде:

struct Grid<T> {
    func at(x: Int, y: Int) -> T
    func at(x: Int) -> [T]
    func at(y: Int) -> [T]
    // add setters as necessary.
}

Вы можете реализовать вышеизложенное с помощью двумерного массива, как у вас уже есть, либо в основной строке, либо в основном столбце, либо в виде одномерного массива, либо в виде разреженного массива (т. е. словаря, где ключами являются кортежи x, y, а значения имеют Т.

Что еще более важно, вы можете проверить производительность каждой из этих идей и использовать ту, которая лучше всего подходит для вашей ситуации, без необходимости изменять код, использующий вашу структуру Grid.

person Daniel T.    schedule 06.08.2017