Java 询问嵌套for循环中的while循环

Java 询问嵌套for循环中的while循环,java,Java,有人能解释一下它是如何工作的吗?我用我的笔记仔细检查了每一个步骤,都写了下来,它确实很好,但是为什么spot 4一直都是?当我用0初始化它时,它对我来说没有意义 这是输出 Random rand=new Random(); int[][]map=新int[行][列]; int spot=0; int i=0; int j=0; /*忽略这一部分 对于(i=0;i这条线: System.out.print(spot); 数组只有4个成员,但在每行末尾打印“spot”的值时,在每行末尾打印4个

有人能解释一下它是如何工作的吗?我用我的笔记仔细检查了每一个步骤,都写了下来,它确实很好,但是为什么spot 4一直都是?当我用0初始化它时,它对我来说没有意义

这是输出

Random rand=new Random();
int[][]map=新int[行][列];
int spot=0;
int i=0;
int j=0;
/*忽略这一部分
对于(i=0;i这条线:

System.out.print(spot);
数组只有4个成员,但在每行末尾打印“spot”的值时,在每行末尾打印4个

编辑:仅当找到1时才回复您关于增加“点”的评论:

    if(map[i][j] == 1){
            while(spot<4){ // <<<< you increase spot until it equals 4
                map[i][j] = 5;
                spot++;
            }
        }
这一行:

System.out.print(spot);
数组只有4个成员,但在每行末尾打印“spot”的值时,在每行末尾打印4个

编辑:仅当找到1时才回复您关于增加“点”的评论:

    if(map[i][j] == 1){
            while(spot<4){ // <<<< you increase spot until it equals 4
                map[i][j] = 5;
                spot++;
            }
        }


我不确定你想用
spot
做什么,但这是你的问题。第一次
if(map[I][j]==1)
是真的,你把
spot
增加到4,所以
虽然(spot我不确定你想用
spot
做什么,但这是你的问题。第一次
if(map[I][j]=1)
是真的,您正在将
spot
增加到4,因此
在(spotwhat?我不明白…你能在循环之前发布你的初始化代码吗?thomas,好的,对不起,我刚刚用@Guy方法的完整代码编辑了,我做了,如果我删除它,它只会打印出spot,你可以看到我的输出。)posted@VerzChan尝试使用调试器。设置一大堆断点,运行调试器,看看每一步都发生了什么。逐渐地,你会了解要删除哪些断点,然后删除它们,然后再次调试并继续。你将自己得到解释。删除最里面的for循环中的while循环,以便只增加一次spot,然后我不确定你想做什么。只有最多4个值替换为5或每行只有一个5或…什么?我不明白…你能发布你的初始化代码吗-循环之前所有相关的内容吗?托马斯,好的,对不起,我刚刚用方法@Guy的完整代码编辑了,我做了,如果我删除了它,它只会打印出斑点,你可以看到我的输出posted@VerzChan试着去爱你关闭调试器。设置一大堆断点,运行调试器,看看每一步都发生了什么。慢慢地,你会了解要删除哪些断点,然后删除它们,然后再次调试并继续。你将自己得到解释。删除最里面的for循环中的while循环,这样你只需增加一次spot,然后我不确定你想做什么。只将最大4个值替换为5,或者每行仅替换一个5,或者……嗯,但是在代码中,我将spot++设置为,仅当它在2d数组元素中找到“1”,即map[I][j],如您所见,当它找到该元素时,它将被存储为5,而输出只能在spot变为“请参见我的编辑”之前找到这5个元素中的1。您将不断增加,直到它等于4。并且您的每个“行”在某处都包含1,因此您将始终以spot==4结束。好的,让我在我的while循环中问一个问题,它是否保持不变一直ide,直到spot变为4?,然后它从该循环中出来执行for?的下一个索引。是的,while循环将被执行到完成。这也意味着在第一次进入该循环后,
spot
将始终==4,因此即使找到另一个1,也不会再次进入同一while循环。是吗你可以使用step调试器(例如在任何半体面的IDE中)?你可以使用它来调试和单步执行每一行,查看执行点的所有值。嗯,但在代码中,我使用spot++,前提是它在2d数组元素中找到“1”,即map[i][j],如您所见,当它找到该元素时,它将被存储为5,而输出只能在spot变为“请参见我的编辑”之前找到这5个元素中的1。您将不断增加,直到它等于4。并且您的每个“行”在某处都包含1,因此您将始终以spot==4结束。好的,让我在我的while循环中问一个问题,它是否保持不变一直ide,直到spot变为4?,然后它从该循环中出来执行for?的下一个索引。是的,while循环将被执行到完成。这也意味着在第一次进入该循环后,
spot
将始终==4,因此即使找到另一个1,也不会再次进入同一while循环。是吗您可以访问step调试器(例如在任何IDE中)?你可以用它来调试和单步遍历每一行,查看执行点的所有值。我可能已经发现了问题,但让我问一个问题,在我的while循环中,它是否一直保持在内部,直到spot变为4?然后它从该循环中出来,执行for的下一个索引?这将用5替换所有1,这是真的吗?是的,但问题是,我只希望这些1中的4个变成5个,而不是所有的1,所以我把while循环放在里面,也许我可以放一些像if(map[i][j]==1&&spot@VerzChan它将执行
map[i][j]=5;
4次,但都是在同一个
i
j
@Guy上,很抱歉反应太晚,不是在同一个i和j上,而是在同一个元素上,但索引不同。显然,我试过了,它成功了,我的帖子中的整个问题是,我误解while循环是if,而不是循环,所以我认为它不会停留在我的位置上在真实情况下,我可能发现了问题,但让我问一个问题,在我的while循环中,它是否一直在循环中,直到点变为4?然后它从循环中出来,进行下一个for索引?这将用5替换所有1,这真的正确吗?是的,但问题是,我只是
if(map[i][j] == 1){
    map[i][j] = 5;
}
public void replaceOnes(int[][] map) {
    int spot = 0;
    for(int i = 0 ; i < map.length ; i++){
        for(int j = 0 ; j < map[i].length ; j++){
            if(map[i][j] == 1){
                map[i][j] = 5;
                spot++;
                if (spot == 4) {
                    return;
                }
            }
        }
    }
}

replaceOnes(map);

for(i = 0; i<map.length; i++){
     for(j = 0; j < map[i].length; j++){
        System.out.print(map[i][j]+" ");
     }
     System.out.println();
}