从我的书中得到了这个例子:
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) 那个让我很困惑的部分,我知道如何用基本数组为每个循环做基础,但是当我使用二维数组时,这让我很困惑。
答案 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
中的每个元素(或数组)运行代码。
希望有所帮助。请随时在评论中向我提问。
对于您在评论中提出的问题,让我们以图形方式查看。
所以这里的橙色框是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);
}
}