创建二维数组时,如何记住首先指定的是行还是列?
9 回答
Java 指定类似于“主要行”配置的数组,这意味着它首先索引行。这是因为二维数组是“数组数组”。
例如:
int[ ][ ] a = new int[2][4]; // Two rows and four columns.
a[0][0] a[0][1] a[0][2] a[0][3]
a[1][0] a[1][1] a[1][2] a[1][3]
它也可以像这样可视化:
a[0] -> [0] [1] [2] [3]
a[1] -> [0] [1] [2] [3]
第二个插图显示了“数组数组”方面。第一个数组包含{a[0] and a[1]}
,每个数组都是一个包含四个元素的数组,{[0][1][2][3]}
。
TL;DR 总结:
Array[number of arrays][how many elements in each of those arrays]
有关更多解释,另请参阅Arrays - 2-dimensional。
尽管 Matt B 的观点在某种意义上可能是正确的,但考虑 Java 多维数组而不考虑几何矩阵可能会有所帮助。Java 多维数组只是数组的数组,第一个“维度”的每个元素的大小可以与其他元素不同,或者实际上可以存储一个空“子”数组。请参阅此问题下的评论
本能地从几何上思考:水平(X)轴,然后是垂直(Y)轴。然而,二维数组的情况并非如此,行在前,然后是列。
考虑以下类比:在几何学中,一个人走到梯子(X 轴)并爬上它(Y 轴)。相反,在 Java 中,一个人下梯子(行)然后走开(列)。
一切都取决于您对数组的可视化。行和列是数组的可视化属性(可能在您的想象中),而不是数组本身。
这与询问数字“5”是红色还是绿色完全一样?
我可以把它画成红色,我可以把它画成贪婪,对吧?颜色不是数字的整体属性。以同样的方式将二维数组表示为行和列的网格对于该数组的存在来说不是必需的。
2D 数组只有第一维和第二维,与可视化相关的一切都纯粹是您的喜好。
当我有 char arraychar[80][25]
时,我可能想在旋转的控制台上打印它,以便我有 25 行 80 个字符,无需滚动即可适应屏幕。
当将二维数组表示为行和列根本没有意义时,我将尝试提供可行的示例:假设我需要一个包含 1 000 000 000 个整数的数组。我的机器有 8GB 的 RAM,所以我有足够的内存,但是如果你尝试执行var a = new int[1000000000]
,你很可能会得到 OutOfMemory 异常。这是因为内存碎片 - 没有这种大小的连续内存块。相反,您可以使用您的值创建 10 000 x 100 000 二维数组。从逻辑上讲,它是一维数组,因此您想将其绘制并想象为单个值序列,但由于技术实现,它是二维的。
在 Java 中,没有多维数组。有数组数组。所以:
int[][] array = new int[2][3];
它实际上由两个数组组成,每个数组包含三个元素。
记住行或列是否在前的最好方法是写评论并提及它。
Java 不会将 2D 数组存储为具有指定行和列的表,而是将其存储为数组数组,就像许多其他答案所解释的那样。因此,您可以决定第一维还是第二维是您的行。您只需要根据此读取数组即可。
所以,由于我自己一直对此感到困惑,所以我总是写一个评论告诉我,二维数组的哪个维度是我的行,哪个是我的列。
在 java 中,行首先完成,因为二维数组被认为是两个单独的数组。从第一行 1 维数组开始。
在 TStringGrid 单元格中,属性 Col 排在第一位。
Property Cells[ACol, ARow: Integer]: string read GetCells write SetCells;
所以赋值StringGrid1.cells[2, 1] := 'abcde';
的值显示在第三列第二行。
在 c++(遥远的、尘土飞扬的内存)中,我认为有时查看代码和理解数组比在 Java 中要容易一些。两者都是行专业。这个插图有助于我理解。
给定这个二维字符串数组的代码......
String[][] messages;
messages = new String[][] {
{"CAT","DOG","YIN","BLACK","HIGH","DAY"},
{"kitten","puppy","yang","white","low","night"}
};
int row = messages.length;
int col = messages[0].length;
将我的整数命名为 2d 数组(行,列),我们会看到这些值。
row = (int) 2
col = (int) 6
最后两行代码,我们尝试确定大小并将它们设置为row
,col
看起来并不那么直观,也不一定正确。
你真正在这里处理的是这个(注意新的变量名来说明):
int numOfArraysIn = messages.length;
int numOfElementsIn0 = messages[0].length;
int numOfElementsIn1 = messages[1].length;
Wheremessages.length
告诉你messages
有两个数组。数组数组。
然后messages[x].length
产生0
1
内部每个单独数组的大小messages
。
numOfArraysIn = (int) 2
numOfElementsIn0 = (int) 6
numOfElementsIn1 = (int) 6
当我们为每个循环打印时......
for (String str : messages[0])
System.out.print(str);
for (String str : messages[1])
System.out.print(str);
CATDOGYINBLACKHIGHDAYkittenpuppyyangwhitelownight
尝试删除括号并像这样打印会出错
for (String str : messages)
System.out.print(str);
incompatible types: String[] cannot be converted to String
在设置.length
用于限制通过数组的步骤的循环时,理解上述内容很重要。