不了解具有二维数组的每个循环

时间:2014-03-05 23:49:17

标签: java arrays foreach

从我的书中得到了这个例子:

public class ForEach3 {
public static void main(String args[]){
    int sum=0;
    int numbers [][]=new int[3][5];

    for(int i=0;i<3;i++)
    {
        for(int j=0;j<5;j++)
        {
            numbers[i][j]=(i+1)*(j+1);
        }
    }


    for(int x[]:numbers)
    {
        for(int y:x)
        {
            System.out.println("Number is: "+y);
            sum+=y;
        }
    }
}
}

我知道所有事情,直到这个循环:

or(int x[]:numbers)
    {
        for(int y:x)

为什么我们必须进行此循环? :for(int y:x) 那个让我很困惑的部分,我知道如何用基本数组为每个循环做基础,但是当我使用二维数组时,这让我很困惑。

6 个答案:

答案 0 :(得分:6)

首先,我们要将numbers重命名为grid,将x重命名为row,将y重命名为cell。让我们分解吧。

for (int x[]:numbers)可以重写为for (int[] row : grid)。这将迭代int[]中存储的所有grid。对于每个int[]row设置为int[]

重写为for (int y : x)的内部循环for (int cell : row)正在迭代row的所有值,即int[],并设置cell等于每个值。第一次外部然后内部循环运行时,row等于grid[0]cell等于row[0]grid[0][0]。这一直持续到grid中的每个值都已使用。

答案 1 :(得分:6)

好的,请考虑以下代码:

for(int x[] : numbers) {
    for(int y : x) {
        System.out.println("Number is: " + y);
    }
}

现在,在第一行,您会看到一些奇怪的语法。 int x[]int[] x的内容相同。 (它只是,说同样的事情是另一种方式。)基本上,你是在声明一个数组。现在,foreach循环将您在:numbers之后指定的数组中的每个元素放入,并将其放入您在:之前声明的变量,或{{ 1}}。

现在,了解此代码的最佳方法是了解2D数组的工作原理。它们不是一些新的特殊事物,所有2D数组都是数组数组。而不是每个元素都是一个值,就像在传统的数组中一样,每个元素都是一个完整的其他数组,它拥有自己的一组值。那么让我们再看一下代码的顶行。

x

这用英语翻译为“对于for(int x[] : numbers) { 中的每个元素,将其值放在numbers中并运行下面的代码。”请记住,因为x数组,所以每个元素都是一个数组。所以代码会在第一次迭代中运行,并检索numbers中的第一个元素(索引0),这是一个numbers的数组。然后,它运行以下代码:

int

顶部代码可以翻译成英文,如下所示:“对于for(int y : x) { System.out.println("Number is: " + y); } 中的每个元素,将其值放在x中并运行下面的代码。”所以,就是这样。代码在第一次迭代中运行,并检索y中的第一个元素,即x。然后,它运行代码:

int

当然,它打印出它检索到的值。然后,内部System.out.println("Number is: " + y); 循环继续通过数组for,直到它到达结尾。此时,就像任何其他x循环一样,它会退出。

现在,请记住,您仍处于for循环的第一次迭代中。现在所有内部代码都已运行,它会检索for(int x[] : numbers)或下一个数组中的下一个元素。 (因为numbers是一个数组数组)它再次运行下面的代码,重复执行,直到它为numbers中的每个元素(或数组)运行代码。

希望有所帮助。请随时在评论中向我提问。

编辑:

对于您在评论中提出的问题,让我们以图形方式查看。

Graphic Representation of 2D Array

所以这里的橙色框是numbers。这是一个数组。其中一个蓝色框中的每个元素。 (总共3个)。现在,看看顶部的蓝色框。这是一个数组。顶部的蓝色框是numbers,或者(在外部循环的第一次迭代期间)numbers[0]。现在看看顶部蓝色框的内部,在绿色框中。每个蓝框的元素都用绿框表示。每个绿色框都是x。第一个蓝色框中的第一个绿色框是(在外环的第一次迭代期间),int或(在外环和内环的第一次迭代期间)x[0]。因此,外部循环遍历橙色框(y)中的所有蓝色框(x),内部循环遍历所有绿色框(numbers)它被给出的蓝框(y)。

这更有意义吗?

答案 2 :(得分:1)

第一个循环描述了第一个数组的索引(length == 3),其中还有一个数组length == 5。第二个循环是遍历数字数组并打印出新行中的每个值。

所以从[0][0...4][1][0...4]和最后[2][0...4]并打印出每个值。

答案 3 :(得分:1)

二维数组实际上是(1维)数组的数组。 int[][]中的每一行或每列(取决于您对2D数组的看法)都是int[],其中的每个项目都是简单的int

对于一些(希望)较少混淆的名称,您的代码变为

int[][] grid = new int[5][5];

for (int[] row : grid)
{
    for(int cell : row)
    {
        System.out.println(cell);
    }
}

因此外部循环遍历行,而内部循环遍历这些行内的元素(并且每次都是不同的行),直到循环访问了网格中的每个单元格一次。

答案 4 :(得分:0)

for(int x[]:numbers)

这里你迭代数字[0],数字[1],数字[2],数字[i]的值被放入变量x。然后x是你迭代的一维数组:

for(int y:x)

答案 5 :(得分:0)

这是关键点:实际上没有“二维数组”这样的东西。正如int[]int的数组一样,int[][]int[]的数组。当你说myArray[1][2]时,它并没有真正进入网格的坐标(1,2)。 myArray是一个数组数组,因此myArray[1]会为您提供一个数组,该数组由[2]编制索引。

或者,重写示例的第一部分:

int numbers[][] = new int[3][5];
for(int i = 0; i < 3; i++)
{
    int[] array = numbers[i];
    for(int j=0;j<5;j++)
    {
        array[j]=(i+1)*(j+1);
    }
}