创建2D数组时,如何记住是先指定行还是列?
答案 0 :(得分:73)
Java被认为是" row major",意味着它首先执行行。这是因为2D数组是数组"。
例如:
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 。
答案 1 :(得分:20)
虽然Matt B在某种意义上可能是真的,但考虑到Java多维数组而不考虑几何矩阵可能会有所帮助。 Java多维数组只是数组的数组,第一个“维”的每个元素可以与其他元素的大小不同,或者实际上可以实际存储空的“子” - 数组。请参阅this question
下的评论答案 2 :(得分:11)
本能地认为是几何学的:水平(X)轴,然后是垂直(Y)轴。然而,这不是2D阵列的情况,首先是行,然后是列。
考虑以下类比:在几何中,一个人走向梯子(X轴)并爬上它(Y轴)。相反,在Java中,一个人下降梯子(行)并走开(列)。
答案 3 :(得分:4)
全部取决于您对阵列的可视化。行和列是数组的可视化(可能在您的想象中)的属性,而不是数组本身。
这与询问数字“5”红色还是绿色完全相同?
我可以把它画成红色,我可以把它画成贪婪吗?颜色不是数字的整数属性。以同样的方式将二维数组表示为行和列的网格对于此数组的存在不是必需的。
2D数组只有 第一维 和 第二维 ,与视觉化相关的一切都纯粹是你的味道
当我有char数组Parent()
Session.commit()
时,我可能想在旋转控制台上打印它,以便我有25行80个字符,适合屏幕而不滚动。
我会尝试在表示2D数组时提供可行的示例,因为行和列根本没有意义:假设我需要一个包含1 000 000 000个整数的数组。我的机器有8GB的RAM,所以我有足够的内存,但如果你尝试执行char[80][25]
,你很可能会得到OutOfMemory异常。这是因为内存碎片 - 没有这种大小的连续内存块。相反,您可以使用您的值创建2D数组10 000 x 100 000。从逻辑上讲它是1D数组,所以你想绘制并将其想象为单个值序列,但由于技术实现它是2D。
答案 4 :(得分:3)
在Java中,没有多维数组。有阵列数组。所以:
int[][] array = new int[2][3];
它实际上由两个数组组成,每个数组都有三个元素。
答案 5 :(得分:1)
记住行或列排在最前面的最好方法是写评论并提及它。
Java不会将2D数组存储为具有指定行和列的表,而是将其存储为数组数组,就像许多其他答案所解释的那样。因此,您可以决定是第一维还是第二维。您只需要根据需要读取数组即可。
因此,由于我自己一直对此感到困惑,所以我总是写一条注释告诉我,二维数组的哪个维度是我的行,哪个列是我的列。
答案 6 :(得分:0)
在java中,首先完成行,因为2维数组被认为是两个独立的数组。从第一行1维数组开始。
答案 7 :(得分:0)
在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;
将我的整数命名为二维数组(行,列),我们会看到这些值。
row = (int) 2
col = (int) 6
我们试图确定大小并将其设置为row
和col
的最后两行代码看起来并不那么直观,而且不一定正确。
您在这里真正要处理的是这个(请注意新的变量名以说明):
int numOfArraysIn = messages.length;
int numOfElementsIn0 = messages[0].length;
int numOfElementsIn1 = messages[1].length;
messages.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
来限制通过数组的步长的循环时,理解以上内容很重要。
答案 8 :(得分:0)
在TStringGrid单元格属性Col中排在最前面。
Property Cells[ACol, ARow: Integer]: string read GetCells write SetCells;
因此,赋值StringGrid1.cells[2, 1] := 'abcde';
的值显示在第三列第二行。