Which comes first in a 2D array, rows or columns?
创建二维数组时,如何记住是先指定行还是先指定列?
Java被认为是"行主要",这意味着它首先行。这是因为二维数组是"数组数组"。
例如:
1 2 3 4 5
| 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] |
它也可以像这样被可视化:
1 2
| a[0] -> [0] [1] [2] [3]
a[1] -> [0] [1] [2] [3] |
第二个图显示了"数组"方面。第一个数组包含{a[0] and a[1]},每个数组包含四个元素,{[0][1][2][3]}。
DR摘要:
1
| Array[number of arrays ][how many elements in each of those arrays ] |
有关更多说明,请参见数组-二维。
虽然Matt B在某种意义上可能是真的,但在不考虑地理矩阵的情况下,可以想到Java多维数组。Java多点数组只是数组的数组,第一个"维度"的每个元素可以与其他元素大小不同,或者实际上可以存储一个空的"子"数组。查看此问题下的评论
- 这是一个真实的答案。
- +1表示阵列与矩阵的对比度!数组没有几何定义。如果您认为一维数组是垂直的,那么行是第一行;如果您认为一维数组是水平的,那么列是第一行。当使用矩形二维数组时,没有逻辑区别,只要在代码中保持相同。根据您的使用情况执行!(当您可以遍历第一个子数组时,不要让自己遍历每个子数组的第一个元素)
本能地认为几何:水平(X)轴,然后垂直(Y)轴。然而,对于二维数组,情况并非如此,先是行,然后是列。
考虑下面的类比:在几何学中,一个人走到梯子(x轴)并爬到梯子(y轴)。相反,在Java中,一个下降梯子(行)并走开(列)。
- @Luiggi请参考你自己的问题可以提问和回答,在这个问题中你会发现(除其他外):To be crystal clear, it is not merely OK to ask and answer your own question, it is explicitly encouraged.。
- 这适用于像这个问题或这个好问题。另外,请注意,这两个问题都是社区维基(投票不会给这些人增加声誉),他们有一个很好的解释,并且都是为了帮助人们,而不是为了让自己受益。
- @Z&233;Ychin这可能更适合聊天。
- 可以想象转置。也就是说,如果你想象列先到行,那就可以了。这在用Java编写的矩阵运算算法中是常见的。
- 不幸的是,没有标准。当人们谈论电脑屏幕时,他们会说"宽度按高度",例如1024x768或1440x900。但当人们谈论食谱卡时,他们会说,"3x5卡"。
所有这些都取决于您对数组的可视化。行和列是数组可视化(可能在您的想象中)的属性,而不是数组本身。
这和问"5"号是红色还是绿色完全一样?
我可以画红色,我可以画贪婪,对吧?颜色不是数字的整数属性。以同样的方式,将二维数组表示为行和列的网格对于该数组的存在是不必要的。
二维数组只有第一个维度和第二个维度,与可视化相关的一切都纯粹是您的风格。
当我有char数组char[80][25]时,我可能希望在控制台上打印它旋转,这样我就有25行80个字符,可以在不滚动的情况下适合屏幕。
当将二维数组表示为行和列时,我将尝试提供一个可行的例子:假设我需要一个1000 000 000个整数的数组。我的机器有8GB的RAM,所以我有足够的内存来处理这个问题,但是如果您尝试执行var a = new int[1000000000],您很可能会遇到内存不足的异常。这是因为内存碎片——没有连续的如此大小的内存块。相反,您可以使用值创建二维数组10000x 100 000。从逻辑上讲,它是一维数组,所以您希望将其绘制并想象为单个值序列,但由于技术实现的原因,它是二维的。
- 有趣的一点!我从未想过数组如何使用内存碎片。为了进一步将其驱动回家,第一个数字表示指针的数量,第二个数字表示每个指针指向的数组的长度(这也意味着一维数组的二维版本实际上为这些指针分配了更多的内存)。
- @4但是,你是对的,锯齿状数组使用的内存比同等的固定大小的二维数组略多,但有时它可能会让你从内存不足的异常中意外地节省下来。我认为这是因为.NET试图使用连续的内存块来分配大对象(不确定为什么虚拟内存块映射不能解决这个问题)。不过,我不是.NET内存模型的专家,所以不要把它当作事实。
- .NET?这是一个Java问题。Windows JVM使用.NET吗?
- 对不起,我已经忘记它是Java问题了,但是我很确定在.NET和JVM中,在内存中表示锯齿形和简单的一维数组没有太大的区别。
在爪哇,没有多维数组。有数组。所以:
1
| int[][] array = new int[2][3]; |
它实际上由两个数组组成,每个数组有三个元素。
- "……"每个都有3个数组。"你是说每个都有3个元素吗?"
- @Muhammadgelbana你说得对:)
在Java中,首先完成行,因为2维数组被认为是两个独立的数组。从第一行维度数组开始。
- 这是C语言,而不是Java语言。在Java编程语言中,多维数组是一个数组,其组件本身是数组。因此,每个组件数组的长度可能不同。你正在写的这个符号是C,它强制矩形2D数组- Java没有-这等同于强迫所有的组件数组具有相等的长度。
- 谢谢你:)穆罕默德·安纳基布
- 谢谢,我不知道矩形二维数组部分的内容。这是个很有帮助的答案。
- 我已将答案更新为更详细和正确的答案。谢谢您,