Java中的双重数组初始化

30

我正在阅读一本关于Java的书,看到一个例子中使用了一种我之前没见过的double类型数组初始化方法。这是什么类型的初始化方式?还有哪些地方可以使用?

double m[][]={
    {0*0,1*0,2*0,3*0},
    {0*1,1*1,2*1,3*1},
    {0*2,1*2,2*2,3*2},
    {0*3,1*3,2*3,3*3}
};

1
我认为第一条语句中的 . 应该是 , - nachokk
要定义一个双精度浮点数,必须使用 * 字符。 - fujy
4
这只是一张乘法表,没有任何问题。 - nneonneo
如果这本书展示了一个例子,那么它肯定会解释它的使用方法、原因和时间。 - user2577094
@fujy:也许这是后来的事情,也许对于这个问题的目的来说并不重要! - nneonneo
显示剩余4条评论
5个回答

39

这是数组初始化语法,它只能在声明数组类型的变量时用于右侧。例如:

int[] x = {1,2,3,4};
String[] y = {"a","b","c"};

如果您不在变量声明的右手边,可以使用数组构造函数代替:

int[] x;
x = new int[]{1,2,3,4};
String[] y;
y = new String[]{"a","b","c"};

这些声明具有完全相同的效果:分配一个新的数组并用指定的内容构造它。

在您的情况下,可能更清晰(不那么重复,但略微不够简洁)通过编程方式指定表格:

double[][] m = new double[4][4];

for(int i=0; i<4; i++) {
    for(int j=0; j<4; j++) {
        m[i][j] = i*j;
    }
}

1
我感受到了禅师的存在。现在我看得更清楚了;-) - Tom
大概像这样复杂的东西可能是如何使用构造函数语法来分配给双倍双倍 double[][] m; m = new double[][] { new double[] { 0 * 0, 1 * 0, 2 * 0, 3 * 0 }, new double[] { 0 * 1, 1 * 1, 2 * 1, 3 * 1 }, new double[] { 0 * 2, 1 * 2, 2 * 2, 3 * 2 }, new double[] { 0 * 3, 1 * 3, 2 * 3, 3 * 3 } }; - Tom

3

您可以通过在大括号中写入它所包含的实际值来初始化数组,如下:

String[] strArr = { "one", "two", "three"};
int[] numArr = { 1, 2, 3};

同样地,二维数组或者数组的数组将一个数组作为值进行存储,因此:
String strArrayOfArrays = { {"a", "b", "c"}, {"one", "two", "three"} };

你的例子恰好说明了这一点。
double m[][] = {
    {0*0,1*0,2*0,3*0},
    {0*1,1*1,2*1,3*1},
    {0*2,1*2,2*2,3*2},
    {0*3,1*3,2*3,3*3}
};

但是数字的乘法也将被执行,与以下内容相同:

double m[][] = { {0, 0, 0, 0}, {0, 1, 2, 3}, {0, 2, 4, 6}, {0, 3, 6, 9} };

1

1

double m[][]声明了一个数组的数组,也称为多维数组。

m[0]指向大小为四的数组,包含0 * 0,1 * 0,2 * 0,3 * 0。简单的数学计算显示这些值实际上是0,0,0,0。

第二行也是大小为四的数组,包含0,1,2,3。

依此类推...

我猜你书中的这种多重格式是为了说明0 * 0是第0行第0列,0 * 1是第0行第1列,以此类推。


谢谢您的回复。我现在意识到这只是一个相当简单的初始化。 - Prateek

1
它被称为数组初始化器,可以在Java 规范10.6中解释。
这可用于初始化任何数组,但只能用于初始化(不能分配到现有数组)。其中一个独特之处是可以从初始值确定数组的维度。创建数组的其他方法要求您手动插入数字。在许多情况下,这有助于最小化当程序员修改初始值并未更新维度时发生的微不足道的错误。
基本上,初始化器会分配正确大小的数组,然后从左到右评估列表中的每个元素。规范还指出,如果元素类型是数组(例如对于您的情况...我们有一个double[]数组),则每个元素本身可能是一个初始化器列表,这就是为什么您会看到一个外部大括号,并且每行都有内部大括号的原因。

1
“Doubt”对于我们其他人来说,有时是指“疑问”。 - Peter Mortensen

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