在2D数组,行或列中哪一个先出现?


Answers:


89

Java被认为是“行主要的”,这意味着它首先执行行。这是因为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]

有关更多说明,另请参见二维数组


8
我很喜欢此答案中提供的可视化。
Donato

1
我不能说服此答案或其来源材料令人信服地证明行应该是第一个数字。我看不出我们不能先进行列再进行行的原因。如果这是约定俗成的,那么我在这里看不到有任何强有力的证明。
Mathieu K.

1
OP并没有询问“为什么” Java是行专业的(从技术上讲不是这样,但是如果您想象它是Java,并且最不用担心内存布局,则最容易概念化)。而是被问到“一个人怎么会记住”来在概念上首先指定行。我发现可视化是记住的最佳方法。应该指出的是,Java本身并没有真正使用行专业语言,而是在我在回答中简短地提到时,确实指定了数组数组。可以在这里找到关于其布局的解释的非常直观的好可视化:stackoverflow.com/a/6631081/1366973
MrHappyAsthma,

21

尽管从某种意义上说Matt B可能是正确的,但可能完全不用考虑几何矩阵就可以考虑Java多维数组。Java多维度数组只是数组的数组,第一维的每个元素的大小都可以与其他元素不同,或者实际上可以存储一个空的“子”数组。查看此问题下的评论


4
+1用于表达ARRAY与MATRIX的对比!数组没有几何定义。如果您认为1D数组是垂直的,那么row是第一个;如果您认为1D数组是水平的,那么col是第一个。使用矩形2D数组时,只要在整个代码中保持相同,就没有逻辑上的区别。根据您的使用情况实施!(当您可以遍历第一个子数组时,不要让自己遍历每个子数组的第一个元素)
Ron

15

本能地从几何角度思考:水平(X)轴,然后垂直(Y)轴。但是,对于2D数组,情况并非如此,首先是行,然后是列。

考虑以下类比:在几何图形中,人走到梯子(X轴)上并爬上梯子(Y轴)。相反,在Java中,人会下降梯子(行)然后走开(列)。


11
@Luiggi请参阅“可以提问并回答您自己的问题”(其中包括):To be crystal clear, it is not merely OK to ask and answer your own question, it is explicitly encouraged.
Matt B

1
这适用于这样的问题这一个这个问题很好。另外,请注意,这两个问题都是社区Wiki(投票不会给这些人增加声誉),它们有很好的解释,而且是为了帮助人们,而不是为了自己谋取利益。
Luiggi Mendoza 2012年

@Zéychin这可能在聊天中更合适。
Matt B

可以想象一下转置。即,如果您想象列首先出现然后行出现,那真的可以。这在用Java编写的矩阵运算算法中很常见。
Mohamed El-Nakib 2013年

不幸的是,没有标准。当人们谈论计算机屏幕时,他们说的是“宽度乘高度”,例如1024x768或1440x900。但是当人们谈论食谱卡时,他们会说“ 3x5卡”。
戴夫·伯顿

5

全部取决于您对阵列的可视化。行和列是数组(而不是数组本身)的可视化属性(可能在您的想象中)。

这与询问数字“ 5”是红色还是绿色完全相同。

我可以把它画成红色,我可以把它画成贪婪吧?颜色不是数字的整体属性。以相同的方式,将2D数组表示为行和列的网格对于该数组的存在不是必需的。

2D数组只有第一个尺寸第二个尺寸,所有与可视化相关的东西都纯属您的口味。

当我有char数组时char[80][25],我可能想在旋转的控制台上打印它,这样我就有25行80个字符,适合屏幕而不滚动。

当将2D数组表示为行和列根本没有意义时,我将尝试提供可行的示例:假设我需要一个1000000000000整数的数组。我的机器有8GB的RAM,所以我有足够的内存,但是如果尝试执行var a = new int[1000000000],很可能会出现OutOfMemory异常。那是因为内存碎片-没有连续的这种大小的内存块。相反,您可以使用自己的值创建2D数组10000 x 100000。从逻辑上讲,它是一维数组,因此您希望将其绘制并想象成一个单一的值序列,但是由于技术实现,它是2D数组。


有趣的一点!我从未想过数组数组将如何使用内存碎片。为了进一步推动它返回,第一个数字代表指针的数量,第二个数字代表每个指针指向的数组的长度(这也意味着1D数组的2D版本实际上为这些指针)。
4castle

@ 4castle,您是对的,锯齿状阵列将使用比等效的固定大小2D阵列更多的内存,但有时可能会令人惊讶地使您摆脱OutOfMemory异常。我认为这是因为.NET试图使用连续的内存块分配大对象(不确定为什么虚拟内存块映射不能解决问题)。我不是.NET内存模型专家,所以不要将其视为事实。
萨沙

。净?这是一个Java问题。Windows JVM是否使用.NET?
4castle

@ 4castle,对不起,我已经忘记了Java问题,但是我很确定.NET和JVM在表示内存中锯齿状的和简单的一维数组方面没有太大区别。
萨沙

2

在Java中,没有多维数组。有数组的数组。所以:

int[][] array = new int[2][3];

它实际上由两个数组组成,每个数组都有三个元素。


1
“ ...每个都有3个数组。” 您的意思是“每个元素都有3个元素”。?
穆罕默德·盖尔巴纳

我不确定这是否能回答所问的问题。在声明数组的数组时,是先行还是先行?
Mathieu K.

1

记住行或列排在最前面的最好方法是编写注释并提及它。

Java不会将2D数组存储为具有指定行和列的表,而是将其存储为数组数组,就像许多其他答案所解释的那样。因此,您可以决定是第一维还是第二维。您只需要读取该数组即可。

因此,由于我自己一直对此感到困惑,所以我总是写一条评论告诉我,二维数组的哪个维度是我的行,哪个列是我的列。


0

在Java中,首先完成行,因为2维数组被认为是两个单独的数组。从第一行1维数组开始。


1
这是在C#中而不是Java中。在Java编程语言中,多维数组是一个数组,其组件本身就是数组。因此,每个组件阵列的长度可能不同。您正在使用C#编写此表示法,它强制矩形2D数组-Java没有该矩形-等效于强制所有组件数组具有相等的长度。
Mohamed El-Nakib

谢谢您:)穆罕默德·安纳奎
Nour Lababidi 2014年

谢谢,我不了解矩形2D阵列部分。这是很有帮助的答案。
Nour Lababidi 2015年

我已经将答案更新为更详细和正确的答案。谢谢,
Nour Lababidi 2015年

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;
    

将我的int命名为二维数组(行,列),我们将看到这些值。

row = (int) 2
col = (int) 6

最后两行代码,我们尝试确定大小并将其设置为rowcol看起来并不那么直观,也不一定正确。

您在这里真正要处理的是这个(请注意新的变量名称以进行说明):

int numOfArraysIn = messages.length;
int numOfElementsIn0 = messages[0].length;
int numOfElementsIn1 = messages[1].length;

哪里messages.length告诉您messages拥有两个数组。数组数组。

然后,ANDmessages[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用于限制通过数组的步长的循环时,理解以上内容非常重要。


0

在TStringGrid单元格属性Col中排在第一位。

Property Cells[ACol, ARow: Integer]: string read GetCells write SetCells;

因此,赋值StringGrid1.cells[2, 1] := 'abcde';将显示在第三列第二行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.