【问题标题】:Need some explanation on 2D String arrays需要一些关于二维字符串数组的解释
【发布时间】:2012-11-02 12:24:33
【问题描述】:

在基本 2D 字符串数组的嵌套 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 并且二维数组是5x10,它会将其打印为5x5,但使用array[0].length 它将打印正确的5x10。

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

【问题讨论】:

  • 关键问题是二维数组是数组的数组。
  • 我不确定你是不是想拖钓。@__@,不过我很清楚这一点。

标签: java arrays eclipse


【解决方案1】:

您正在处理一个 2D 数组。 array.length 本质上给出了行数,但array[0].length 给出了 的数量(至少对于非锯齿状数组)。举个例子:

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

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

【讨论】:

  • 如果我把它改成array[i].length而不是array[0].length会发生什么?
  • @AmirsanThavanesan 在这种情况下什么都没有 - 因为它是一个 square 数组,所以 array[i].length 将始终相同。如果你有一个锯齿状数组,你将不得不这样做。
  • 同在?我假设你的意思是锯齿状:136 258 479
  • array[i].length 相同,每个i 的数字始终相同(假设i 在范围内)。在您的情况下,它将始终是 10。锯齿状数组解释here
  • 如果它包含array.length,会有什么不同。
【解决方案2】:

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

array = new String [5][10];

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

 [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 数组的数组,这就是为什么我从 04 并且数组的长度是 5。第二个 for 迭代包含的 String[] 对象的索引在第一个数组上(长度为 5 的数组)。该数组的长度为10 个元素。

【讨论】:

  • 如果我把第二个for改成array.length会有什么问题呢?
  • 因为这个二维数组有 5 行 10 列。因此,在第一个循环中,您获得的每个元素都是包含 10 个字符串的行。因此,您希望第二个循环运行 10 次。因此,您执行 array[0].length 评估为 10 而不是 array.length 评估为 5
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    第二个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,因为当 j = 5 时,列数将被超出。

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

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

    【讨论】:

    • 那么如果两个for 语句都包含array.length 会有什么问题?会不会只是以行数作为列数来创建一个“方形”表?
    • 通过在第二个for 循环中使用array.length,只有一半的String 值将被分配,其余的将保持为null
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    相关资源
    最近更新 更多