Java:for/forEach通过int矩阵运行
这不是一个“如何做某事”的问题,而是一个“为什么我不能那样做”的问题 很明显,我在这里错过了一些重要的东西(我猜是关于参考资料的)来理解这个问题,如果有人能给我解释一下就好了 我确实找到了以前处理过这个问题的其他帖子,但没有一篇解释过 我想给int矩阵的每个元素赋值 我有一段代码如下:Java:for/forEach通过int矩阵运行,java,loops,foreach,Java,Loops,Foreach,这不是一个“如何做某事”的问题,而是一个“为什么我不能那样做”的问题 很明显,我在这里错过了一些重要的东西(我猜是关于参考资料的)来理解这个问题,如果有人能给我解释一下就好了 我确实找到了以前处理过这个问题的其他帖子,但没有一篇解释过 我想给int矩阵的每个元素赋值 我有一段代码如下: public static void main(String[] args) { int[][] tileMatrix = new int[5][5]; System.out.println("
public static void main(String[] args)
{
int[][] tileMatrix = new int[5][5];
System.out.println("New Tile Values:");
for ( int[] tileLine : tileMatrix)
{
for ( int tile : tileLine)
{
tile = (int) (Math.random() * 39);
System.out.print(tile + " ");
}
System.out.println("");
}
System.out.println("Check Values");
for ( int[] tileLine : tileMatrix)
{
for ( int tile : tileLine)
{
System.out.print(tile + " ");
}
System.out.println("");
}
}
for (int i = 0; i < tileLine.length; i++) {
int tile = tileLine[i];
//you modify the local variable tile, not the element in the array
tile = (int) (Math.random() * 39);
System.out.print(tile + " ");
}
这导致:
新磁贴值:
221729205123383519
11902327
24336319
37 4 5 18 26
检查值 0
0
0
0
0 0 0 0
很明显,我不能像那样改变这些值。我不知道这在foreach循环中是否通常是不可能的,或者我只是做错了。我知道,我可以用普通for循环解决我的问题,但为什么我必须这样做?增强的
for
循环将只获取数组中元素的值,并将它们存储在变量中。对于值,这表示存储在数组中的基元或参考值的副本。如果将新值重新分配给此变量,则只需修改此变量的值,而不是数组中的值
这就解释了为什么这个for
循环不起作用:
上面的for
语句的行为如下:
public static void main(String[] args)
{
int[][] tileMatrix = new int[5][5];
System.out.println("New Tile Values:");
for ( int[] tileLine : tileMatrix)
{
for ( int tile : tileLine)
{
tile = (int) (Math.random() * 39);
System.out.print(tile + " ");
}
System.out.println("");
}
System.out.println("Check Values");
for ( int[] tileLine : tileMatrix)
{
for ( int tile : tileLine)
{
System.out.print(tile + " ");
}
System.out.println("");
}
}
for (int i = 0; i < tileLine.length; i++) {
int tile = tileLine[i];
//you modify the local variable tile, not the element in the array
tile = (int) (Math.random() * 39);
System.out.print(tile + " ");
}
for(int i=0;i
如果要修改数组中的值,应直接修改数组中的值:
for (int i = 0; i < tileLine.length; i++) {
tileLine[i] = (int) (Math.random() * 39);
System.out.print(tileLine[i] + " ");
}
for(int i=0;i
我知道您提到您不想知道如何做某事,但您可能想看看JDK8=只影响您当前与之交互的变量
一个非常简单的例子说明了为什么循环不更改数组中存储的值
int a=5;
int b=a;
b=10;
System.out.println(a); //prints 5
您的代码显然比这更复杂,但本质上是一样的。数组中的每个值都复制到一个变量中,然后对该变量进行操作
for ( int[] tileLine : tileMatrix)
{
for ( int tile : tileLine)
{
tile = (int) (Math.random() * 39); //<---tile is the same as b in my example
System.out.print(tile + " ");
}
System.out.println("");
}
因此,总结一下,当您使用变量java(在幕后)时,它会遵从它,并获得真正的对象供您使用
tileMatrix实际上是一维矩阵(假装是二维矩阵)。它可能包含以下内容
#120
#130
#1180
#2021
#2022
1
5
5
1
4
然后,当我们查看其中一个内存地址时,比如#120,我们发现它包含以下内容
#120
#130
#1180
#2021
#2022
1
5
5
1
4
你看,如果我们有内存地址#120,我们在哪里并不重要,我们指的是同一个地方
这里的内存模型不应该是精确的,只是在概念上有用,实际上它比这个更复杂噢,但是实际上可以保持First foreach循环,以获得tileLines数组?这至少可以保存一个迭代变量(其中两个很难看)@Soronume是的,你可以这样做。谢谢!(但不知何故,我不明白数组是如何成为实际数组的,而值只是一个副本…@Soroname检查第二段代码,它是第一段代码的精确表示形式。