Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:for/forEach通过int矩阵运行_Java_Loops_Foreach - Fatal编程技术网

Java:for/forEach通过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("

这不是一个“如何做某事”的问题,而是一个“为什么我不能那样做”的问题

很明显,我在这里错过了一些重要的东西(我猜是关于参考资料的)来理解这个问题,如果有人能给我解释一下就好了

我确实找到了以前处理过这个问题的其他帖子,但没有一篇解释过

我想给int矩阵的每个元素赋值

我有一段代码如下:

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 + "  ");
}
这导致:

新磁贴值: 221729205
123383519
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检查第二段代码,它是第一段代码的精确表示形式。