4

在基本二维字符串数组的嵌套for循环中,我遇到了这个:

 array = new String [5][10];
for(int i=0; i<array.length;i++)
{
    for(int j=0; j<array[0].length;j++)
    {
        System.out.print(array[i][j]="*");
    }
    System.out.println("");
}

现在这就是我想知道的,为什么第二个for语句在它之前的语句中包含array[0].length而不是array.lengthlike for

我在实验时可以从中提取的只是如果两个for语句都包含array.length并且 2D 数组是 5x10,它将打印为 5x5,但array[0].length它会打印正确的 5x10。

那么为什么这个小小的调整可以解决所有问题呢?

4

4 回答 4

5

你正在处理一个二维数组。array.length本质上为您提供了行数,但array[0].length提供了数(至少对于非锯齿状数组)。举个例子:

String[][] array = new String[][]{
    {"1","2"},
    {"3","4"},
    {"5","6"}
};

这里array.length3(整个二维数组由三个一维数组组成),但是array[0].length2每个组成数组的长度)。您的第一个for-loop 循环遍历整个数组数组,但您的第二个循环遍历外部循环遇到的每个组成数组。因此,内部循环应该只循环到(但不包括)array[0].length

于 2012-11-14T00:58:19.513 回答
4

二维数组就像一个矩阵,由String对象数组的数组表示。当你定义:

array = new String [5][10];

你说“我想要一个长度为 10 的 5 个字符串数组的数组”,如下所示:

 [String[10]][String[10]][String[10]][String[10]][String[10]]

这里:

for(int i=0; i<array.length;i++)
{
    for(int j=0; j<array[0].length;j++) //I'd recommend j < array[i] here. Nothing 
                                        //changes on this case, but it would bring 
                                        //some trouble if the second dimention of the 
                                        //array was not the same for every case.
    {
        System.out.print(array[i][j]="*");
    }
    System.out.println("");
}

第一个 for 迭代五个String数组的数组,这就是为什么 i 从0to4并且数组的长度为 5。第二个 for 迭代String[]第一个数组中包含的对象的索引(具有 length 的那个5)。该数组具有一定长度的10元素。

于 2012-11-14T01:04:52.387 回答
0

这是因为array[0]实际上是一个String[]数组。

于 2012-11-14T00:56:48.513 回答
0

第二条for语句需要获取数组中的列数,在本例中为 10。

  • array.length- 不。行数
  • array[0].length- 列数

这个数组被假定为方形而不是锯齿状,因此array[0]在这个例子中使用被认为是安全的。

让我们看看错误的方式: 通过这样做:

for (int i=0; i<array.length;i++) {
    for(int j=0; j < array.length;j++) {
        System.out.print(array[i][j]="*");
    }
}

您只显示 5 x 5 个条目,缺少一半的条目数。此外,如果数组最初是 10 行 x 5 列,ArrayIndexOutOfBoundsException则会抛出 an ,因为当 时超过列数j = 5

显示二维数组的一种便捷方式是:

System.out.println(Arrays.deepToString(array));
于 2012-11-14T00:57:14.307 回答