如果我想到 x,y 坐标平面 x,y 是有序对的常用符号,但如果我使用二角钱数组,我有 myArray[row][col] 并且 row 是 y 而 col 是 x . 这是倒退还是我只是想错了?我在想它看起来像 myArray[x][y] 但如果我想要真正的行和列(比如在游戏板中)那就错了。难道不是 myArray[y][x] 真正模仿行列板吗?
8 回答
你说得对,它确实感觉有点倒退。行号是y坐标,列号是x坐标,但是我们通常写row,col但我们也通常写x,y。
是否要将数组编写为 [y][x] 取决于或 [x][y] 主要取决于您对内存布局的实际关心程度(以及如果您这样做,您使用什么语言)。以及是否要编写可以单独对行或列进行操作的函数/方法。
如果您正在编写 C/C++ 代码,则数组以Row Major Order存储,这意味着可以将单行数据视为一维数组。但是单列数据不能。如果我没记错的话,VB 使用列主顺序,所以语言会有所不同。我会惊讶于 C# 也不是行主要顺序,但我不知道。
这就是我为自己的理智所做的事情:
int x = array[0].length;
int y = array.length;
然后对于我所做的每一个数组调用,我都会写:
array[y][x]
这对于图形算法和水平/垂直矩阵翻转特别有用。
如何将数据存储在数组([x][y] 或 [y][x])中并不重要。重要的是您总是以连续的方式遍历数组。java 二维数组本质上是一个存储第二个数组的一维数组(例如,在 [y][x] 的情况下,您有一个长数组 [y],其中每个 y 都保存相应的 [x] 数组y 线)。
为了有效地遍历整个数组,以某种方式访问数据很重要,这样您就不必连续在该数组中进行搜索,从一个 y-array-of-xarrays 跳转到另一个 y-array-of-数组。您要做的是访问一个 y 元素并访问其中的所有 x,然后再移动到下一个 y 元素。
所以在 Array[y][x] 的情况下。总是在外循环中有第一个变量,在内循环中有第二个变量:
for (int ys = 0; ys < Array.length; ys++)
for (int xs = 0; xs < Array[y].length; xs++)
{
do your stuff here
}
当然,在循环之外预先分配两个 Array.lengths 以防止必须在每个循环中获取这些值。
我喜欢这个问题。你是绝对正确的。大多数时候,我们不是在想 (x, y) 就是 (row, col)。在我质疑它之前已经有好几年了。然后有一天我意识到我总是处理 for 循环,好像 x 是一行而 y 是一列,尽管在平面几何中它实际上是相反的。正如许多人所提到的,在大多数情况下这真的无关紧要,但一致性是一件美好的事情。
其实,这取决于你。你的问题没有思考的权利。例如,我通常将一维数组视为一行单元格。所以,在我看来,它是数组 [col] [row]。但这真的取决于你......
我敢打赌,对此有很多不同的看法。底线是,只要您始终如一,这并不重要。如果您有其他库或类似的库将使用相同的数据,那么为了更容易集成而做任何事情可能是有意义的。
如果这严格在您自己的代码中,请做任何您觉得舒服的事情。我个人的偏好是使用 myArray[y][x]。如果它们很大,将要同时访问的项目放在一起可能会带来性能优势。但是,如果有的话,我不会担心,直到很晚的时候。
不是真的,如果您将一行视为 x 轴上的元素,然后二维数组是 y 轴上的一堆行元素,那么使用 y 对一行进行操作是正常的,因为您已经知道 x (对于特定的行 x 始终相同,它的 y 随其索引而变化)然后使用 x 对多个行元素进行操作(行垂直堆叠,每行都具有特定的 y 值)
无论好坏,不一致的符号是从数学继承而来的。
多维数组遵循矩阵表示法,其中M i,j表示第i行和第j列上的矩阵元素。
因此,如果用于表示矩阵,多维数组并不落后,但如果用于表示 2D 笛卡尔平面,其中 ( x , y ) 是坐标的典型排序,它们会显得落后。
另请注意,二维笛卡尔平面通常以 y 轴向上增长的方式定向。然而,这也与二维数组/矩阵的通常可视化方式(以及大多数光栅图像的坐标系)相反。