如果我想到x,y坐标平面x,y是有序对的常用符号,但如果我使用二角形数组,我有myArray [row] [col],行是y和col是x。这是倒退还是我只是想错了?我认为它看起来像myArray [x] [y],但如果我想要真正的行和列(如游戏板中)那就错了。难道不是myArray [y] [x]真正模仿行列板?
答案 0 :(得分:30)
你做对了,感觉有些倒退了。行号是y坐标,列号是x坐标,但我们通常写row,col但我们通常也写x,y。
是否要将数组编写为[y] [x]取决于或[x] [y]主要取决于您实际关心内存中的布局(如果使用的话,使用的是哪种语言)。以及是否要编写可以独立操作行或列的函数/方法。
如果您正在编写C / C ++代码,则数组存储在Row Major Order中,这意味着可以将单行数据视为一维数组。但是单列数据却不行。如果我没记错的话,VB会使用列主要顺序,因此语言会有所不同。我很惊讶C#也不是主要的排序,但我不知道。
答案 1 :(得分:4)
如何将数据存储在数组中[[x] [y]或[y] [x])并不重要。重要的是你总是以连续的方式遍历数组。 java二维数组本质上是存储第二个数组的一维数组(例如,在[y] [x]的情况下,你有一个长的[y]数组,其中每个y都包含相应的[x]数组y)。
要有效地遍历整个数组,以一种方式访问数据非常重要,这样您就不必连续地在该数组中进行搜索,从一个y-array-of-xarrays跳转到另一个y-array -of-xarrays。你想要做的是访问一个y元素并访问那里的所有x,然后再移动到下一个y元素。
所以在Array [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.lengths预先分配出循环,以防止每个循环都得到这些值。
答案 2 :(得分:2)
这是我出于自己的理智而做的事情:
int x = array[0].length;
int y = array.length;
然后对于我进行的每个单个数组调用,我写:
array[y][x]
这对于图形算法和水平/垂直矩阵翻转特别有用。
答案 3 :(得分:0)
实际上,这取决于你。你的问题无权思考。例如,我通常将一维数组视为一行单元格。所以,在我看来它是数组[col] [row]。但这完全取决于你......
答案 4 :(得分:0)
我敢打赌,对这一点有很多不同意见。最重要的是,只要你保持一致,这并不重要。如果你有其他库或类似的将使用相同的数据,那么做他们做的任何事情都可能有意义,以便更容易集成。
如果这完全在您自己的代码中,请做您认为合适的事情。我个人的偏好是使用myArray [y] [x]。如果它们很大,那么保持您要同时访问的项目可能会有很大的性能优势。但是我不会担心这一点,直到最后阶段才会发生。
答案 5 :(得分:0)
嗯,不是真的,如果你想把一行作为x轴上的元素,然后一个二维数组是y轴上的一堆行元素,那么使用y操作一行是正常的,因为你已经知道x(对于那个特定的行x总是相同的,它的y随着它的索引而变化)然后使用x来操作多个行元素(行垂直堆叠,每个行都处于特定的y值)
答案 6 :(得分:0)
我喜欢这个问题。你是绝对正确的。大多数时候我们要么在思考 (x, y) 要么 (row, col)。几年前我质疑它。然后有一天我意识到我总是把 for 循环当作 x 是一行,y 是一列,尽管在平面几何中它实际上是相反的。正如许多人所提到的,在大多数情况下这并不重要,但一致性是一件美妙的事情。
答案 7 :(得分:0)
无论好坏,不一致的符号都是从数学继承而来的。
多维数组遵循矩阵表示法,其中 Mi,j 表示行 i 和列 j.
因此,如果用于表示矩阵,多维数组不是向后,但如果用于表示二维笛卡尔平面,其中 (x, y) 是坐标的典型排序。
另请注意,2D 笛卡尔平面的方向通常是 y 轴向上增长。然而,这也与二维数组/矩阵的通常可视化方式(以及大多数光栅图像的坐标系)背道而驰。