2D字符串数组的解释说明

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而不像之前的for语句一样包含array.length
当我进行实验时,我只能从中提取到:如果两个for语句都包含array.length,并且2D数组为5x10,则它会将其打印成一个5x5,但是使用array[0].length则会正确地打印出5x10。
那么为什么这个小调整可以修复所有问题呢?

1
关键问题在于2D数组是一个数组的数组。 - Louis Wasserman
我不确定你是否在尝试恶作剧.. @__@,但我很清楚这一点。 - SelfDeceit
4个回答

5

你正在处理一个二维数组(2D)。 array.length 实际上给出了行数,但是array[0].length 给出了列数(至少对于非交错数组而言)。参考下面的例子:

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

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

如果我将其更改为array[i].length而不是array[0].length,会发生什么? - SelfDeceit
在这种情况下没有任何问题 - 因为它是一个“方”的数组,所以array [i] .length始终相同。如果你有一个不规则的数组,则必须这样做。 - arshajii
同上?按您的说法,锯齿状指的是:136 258 479 - SelfDeceit
array[i].length中的值对于每个i都是相同的数字(假设i在范围内)。在您的情况下,它将始终为**10**。关于不规则数组的解释可以在这里找到。 - arshajii
如果它包含了array.length,会有什么不同? - SelfDeceit
显示剩余2条评论

4

一个2D数组就像一个矩阵,由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("");
}

第一个循环迭代了包含五个String数组的数组,这就是为什么i从04,数组的长度是5。第二个循环迭代了第一个数组中包含的String[]对象的索引(长度为10个元素)。


如果我将第二个 for 改为 array.length,会有什么问题吗? - SelfDeceit
由于这个二维数组有5行10列,因此在第一个循环中,您获取的每个元素都是一个包含10个字符串的行。 所以,您希望第二个循环运行10次。因此,您需要使用array[0].length而不是array.length,因为前者的值为10,而后者的值为5。 - Robin Chander

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列,则当j = 5时将抛出ArrayIndexOutOfBoundsException,因为超过了列数。

显示2D数组的便捷方法是:

System.out.println(Arrays.deepToString(array));

那么,如果两个 for 语句都包含 array.length,会出现什么问题?它只会通过将行数作为列数来创建“正方形”表格吗? - SelfDeceit
通过在第二个for循环中使用array.length,只有一半的String值会被分配,其余的将保持为null - Reimeus

0

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


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