Java二维数组定义

6

我有一个非常基础的问题。

例如:

int a[][] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}} 

我们将其称为[3][4],因为它有3个元素,每个元素都有自己的4个元素。但是,如果是这样的呢:
int a[][] = {{1},{5,6,7},{9,10,11,12}} 

这还是[3][4]吗?


更新

根据下面的有用评论,我的第一个例子可以写成[3][4]数组,但第二个例子不能这样表示,对吗?


无论哪种情况,您都有一个数组的数组,只是在第一个例子中,所有长度都相同。 - user902383
1
关于您的更新,是正确的。 - Luke Willis
6个回答

6
这些被称为不规则数组,它们不被认为是m-by-n,因为它们不符合矩阵的正式定义。
在数学中,矩阵(复数为matrices)是一个由数字、符号或表达式组成的矩形数组,按行和列排列。

3

根据Java的定义:

多维数组是由数组组成的数组。这与C或Fortran中的数组不同。这意味着行的长度可以不同。

例如:int a[][]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}

在这里,你不能说它是一个[3][4]的数组,但可以说它有3个元素,每个元素有自己的4个元素。

再举个例子:int a[][]={{1},{5,6,7},{9,10,11,12}}
在这里,你可以说这个数组有3个元素,每个元素有不同的元素数量。


只有数组中的所有子数组长度相等时,才能称之为[m][n],是吗? - Wang Pei The Dancer
@WangPeiTheDancer 是的,它们只遵循矩阵的定义。 - Prabhaker A

2

我刚在 Android 环境中进行了这个测试,这应该对这种情况有效(我认为)。

int a[][] = { { 1 }, { 5, 6, 7 }, { 9, 10, 11, 12 } };
    for (int i = 0; i < a.length; i++) {
        Log.i("", "i: " + i);
        for (int j = 0; j < a[i].length; j++) {
            Log.i("", "j: " + j);
        }
}

我得到的是:
i: 0
j: 0
i: 1
j: 0
j: 1
j: 2
i: 2
j: 0
j: 1
j: 2
j: 3

所以,a不是 int[3][4]

只有数组中的所有子数组长度相等时,才能称之为[m][n],是吗? - Wang Pei The Dancer
[m][n] 指列数和行数。每个 [m] 和 [n] 的交叉点必须填入一个值才能被视为矩阵。否则它就是一个不规则数组。 - But I'm Not A Wrapper Class

0
Java 中没有二维数组。
只存在数组的数组,其中每个数组可以具有不同的长度。
对于矩阵,请考虑线性内存布局,并使用现有库之一。
请注意,在 Java 中以下内容是有效的:
int[][] example = new int[2][2];
example[0] = new int[]{1,2,3,4,5,6,7,8,9,10};

一个合适的矩阵模块不会允许这种情况发生。

这既是一种优点,也是一种缺点。有些应用程序需要使用数组嵌套数组。而有些情况下,这样做更加高效(例如只存储半个三角形矩阵)。


0

它不是[3][4]。

它是一个数组的数组,其中外部数组的维度为“3”,而数组元素(再次是数组)的长度各不相同,分别为1、3和4。


0
不,它不是。当你像这样写 int[][] test = new int[3][4] 时,那只是语法糖。双重数组并没有什么神奇的地方。
两个示例都是数组的数组。你的第一个恰好有所有这些数组相同的长度,而第二个则没有。
顺便说一句,绝大多数Java程序员使用int[][] a表示法,而不是int a[][]表示法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接