【问题标题】:Double array initialization in JavaJava中的双数组初始化
【发布时间】:2013-09-02 18:18:48
【问题描述】:

我正在阅读一本关于 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}
};

【问题讨论】:

  • 我认为第一个语句中的. 应该是,
  • 您的代码不会这样编译。点应该是逗号。
  • 要定义双精度,* 字符必须是 .字符
  • @fujy:这只是一个乘法表。没有错。
  • 如果书中展示了一个示例,那么它肯定会解释如何以及为什么以及何时使用它。

标签: java arrays initialization double


【解决方案1】:

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

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

如果您不在变量声明的 RHS 上,请改用数组构造函数:

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;
    }
}

【讨论】:

  • 我感觉到那里有一位禅师。我现在看得更清楚了;-)
  • 大概像这样令人费解的事情是如何使用构造函数语法 `double[][] m; 分配给 double double m = new double[][] { new double[] { 0 * 0, 1 * 0, 2 * 0, 3 * 0 }, new double[] { 0 * 1, 1 * 1, 2 * 1, 3 * 1 }, 新双 [] { 0 * 2, 1 * 2, 2 * 2, 3 * 2 }, 新双 [] { 0 * 3, 1 * 3, 2 * 3, 3 * 3 } };`
【解决方案2】:

您可以通过在右侧的花括号中写入实际值来初始化数组,例如:

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

以同样的方式二维数组或array-of-arrays 将数组作为值保存,所以:

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} };

【讨论】:

    【解决方案3】:

    double m[][]声明了一个数组数组,也就是所谓的多维数组。

    m[0]指向一个大小为4的数组,包含0*0,1*0,2*0,3*0。 简单的数学表明这些值实际上是 0,0,0,0。

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

    等等……

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

    【讨论】:

    • 感谢您的回复。我现在意识到这是一个非常简单的初始化。
    【解决方案4】:

    它被称为数组初始化器,可以在Javaspecification 10.6中解释。

    这可用于初始化任何数组,但它只能用于初始化(不能分配给现有数组)。它的独特之处之一是数组的尺寸可以从初始化程序中确定。创建数组的其他方法需要您手动插入数字。在许多情况下,这有助于最大限度地减少程序员修改初始化程序但未能更新维度时发生的琐碎错误。

    基本上,初始化程序分配一个大小正确的数组,然后从左到右评估列表中的每个元素。规范还指出,如果元素类型是一个数组(例如对于您的情况......我们有一个 double[] 数组),那么每个元素本身可能是一个初始化列表,这就是为什么您会看到一个外大括号,每一行都有内大括号。

    【讨论】:

    【解决方案5】:

    如果您可以接受 Double Objects,那么这篇文章会很有帮助: Initialization of an ArrayList in one line

    List<Double> y = Arrays.asList(null, 1.0, 2.0);
    Double x = y.get(1);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-14
      • 2013-11-28
      • 1970-01-01
      • 2012-10-08
      • 1970-01-01
      • 2012-07-17
      • 2011-07-30
      相关资源
      最近更新 更多