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

1 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;
        }
    }
}
}
Run Code Online (Sandbox Code Playgroud)

我理解一切,直到这个循环:

or(int x[]:numbers)
    {
        for(int y:x)
Run Code Online (Sandbox Code Playgroud)

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

nru*_*n29 6

首先,我们将重命名numbersgrid,xto row,yto cell.让我们分解吧.

for (int x[]:numbers)可以改写为for (int[] row : grid).这会迭代int[]存储的所有内容grid.对于每个int[],row设置为int[].

内部循环被for (int y : x)重写为for (int cell : row)迭代所有的值row,即a int[],并且设置cell等于每个值.第一次外然后内部循环运行,row等于grid[0]cell等于row[0],或grid[0][0].这一直持续到使用了每个值grid.


And*_*ies 6

好的,请考虑以下代码:

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

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

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

for(int x[] : numbers) {
Run Code Online (Sandbox Code Playgroud)

这用英语翻译成"对于每个元素numbers,将其值放入x并运行下面的代码".请记住,因为numbers是一个数组数组,它的每个元素都是一个数组.所以代码在第一次迭代中运行,并检索numbers(在索引0处)的第一个元素,这是一个ints 数组.然后,它运行以下代码:

for(int y : x) {
    System.out.println("Number is: " + y);
}
Run Code Online (Sandbox Code Playgroud)

顶行代码可以翻译成英文,如下所示:"对于每个元素x,将其值放入y并运行下面的代码." 所以,就是这样.代码运行第一次迭代并检索第一个元素x,即int.然后,它运行代码:

System.out.println("Number is: " + y);
Run Code Online (Sandbox Code Playgroud)

当然,它会打印出它检索到的值.然后,内for循环继续通过数组,x直到它到达结束.此时,就像任何其他for循环一样,它会退出.

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

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

编辑:

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

二维阵列的图形表示

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

那更有意义吗?