Являются ли атрибуты x, y и row, col двумерного массива обратными? - PullRequest
38 голосов
/ 05 февраля 2010

если я думаю о координатной плоскости x, y x, y - это обычное обозначение для упорядоченной пары, но если я использую двумерный массив, у меня есть myArray [row] [col], а row - это y и col это х. Это задом наперед или я просто думаю об этом неправильно? Я думал, что это будет выглядеть как myArray [x] [y], но это неправильно, если я хочу, чтобы реальные строки и столбцы (как на игровой доске). Разве myArray [y] [x] действительно имитирует доску столбцов строк?

Ответы [ 6 ]

31 голосов
/ 05 февраля 2010

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

Хотите ли вы записать свой массив как [y] [x], зависит или [x] [y] зависит в основном от того, насколько вы на самом деле заботитесь о расположении в памяти (и если да, то какой язык вы используете). и хотите ли вы написать функции / методы, которые могут работать со строками или столбцами изолированно.

Если вы пишете код на C / C ++, массивы хранятся в Порядке строк , что означает, что одна строка данных может рассматриваться как одномерный массив. Но один столбец данных не может. Если я правильно помню, VB использует основной порядок столбцов, поэтому языки меняются. Я был бы удивлен, что C # также не является основным порядком строк, но я не знаю.

4 голосов
/ 29 июня 2013

Неважно, как вы храните ваши данные в массиве ([x] [y] или [y] [x]). Важно то, что вы всегда проходите по массиву непрерывным образом. Двухмерный массив Java по сути является одномерным массивом, хранящим второй массив (например, в случае [y] [x] у вас есть длинный массив [y], в котором каждый y содержит соответствующие [x] массивы для этого линия у).

Чтобы эффективно проходить через весь массив, важно получить доступ к данным таким образом, чтобы вам не приходилось непрерывно выполнять поиск в этом массиве, переходя от одного y-массива xarrays к другому y-массиву. -Из-xarrays. То, что вы хотите сделать, это получить доступ к одному элементу y и получить доступ ко всем x там, прежде чем переходить к следующему элементу y.

Так что в ситуации с массивом [y] [x]. всегда есть первая переменная во внешнем цикле и вторая во внутреннем цикле:

for (int ys = 0; ys < Array[y].length; ys++)
    for (int xs = 0; xs < Array[y][x].length; xs++)
    {
        do  your stuff here
    }

И, конечно, предварительно выделите обе длины Array.length вне цикла, чтобы избежать необходимости получать эти значения каждый цикл.

2 голосов
/ 27 марта 2019

Вот что я делаю для собственного здравомыслия:

int x = array[0].length;
int y = array.length;

И затем для каждого отдельного вызова массива я пишу:

array[y][x]

Это особенно полезно для алгоритмов построения графиков и переворачивания матрицы по горизонтали / вертикали.

0 голосов
/ 25 октября 2012

Ну, не совсем, если вы думаете о строке как об элементах на оси x, а затем массив 2d - это набор элементов строки на оси y, тогда нормально использовать y для работы со строкой, так как вы уже знать x (для этой конкретной строки x всегда один и тот же, это y, который изменяется с его индексами), а затем использовать x для работы с несколькими элементами строки (строки располагаются вертикально, каждая с определенным значением y)

0 голосов
/ 05 февраля 2010

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

Если это строго в вашем собственном коде, делайте все, что вам удобно. Мое личное предпочтение было бы использовать myArray [y] [x]. Если они велики, может быть преимущество в производительности, если хранить элементы, к которым вы собираетесь получить доступ, одновременно. Но я бы не стал беспокоиться об этом до очень поздней стадии, если вообще.

0 голосов
/ 05 февраля 2010

На самом деле, это зависит от вас. В вашем вопросе нет права думать. Например, я обычно думаю об одномерном массиве как о строке ячейки. Итак, на мой взгляд, это массив [col] [row]. Но это действительно зависит от вас ...

...