在Java中学习嵌套的while循环

时间:2011-02-12 07:00:02

标签: java loops while-loop

在这个程序中,内部循环生成100和100之间的随机数     然后停止生成它们     随机数为7.外环重复内循环100次     为什么我的外环不能重做内循环?
    好像它只做了一次。

package test;


public class Loops {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int i = 0;
        int sum = 0;
        int counter = 0;
        String randomNumberList = " ";
        int c = 0;
        while (c != 100){

            while (i != 7) {
            i = (int) (101 * Math.random());
            sum += i;
            ++counter;
            randomNumberList += " " + i;
            }
        System.out.print("\n loop repeated" + counter+ " times and generated these numbers: " + randomNumberList);
            ++c;
        }

    }

}

3 个答案:

答案 0 :(得分:7)

内循环运行直到i = 7.完成后,我仍然是7,所以在你将i改为其他值之前它不会再次运行。

如果将其更改为do-while循环,则应该清除问题。

答案 1 :(得分:4)

只是因为在开始内循环之前(或在结束之后)没有重置i

因此,在外部循环的第二次和后续迭代中,您将转到内部while语句,但条件i != 7仍然是false并且您不执行内环体。

一个简单的解决方法是在内部i = 0之前添加while

更优雅的解决方法是将内部while更改为do ... while

答案 2 :(得分:0)

最好的解决方法是使用for循环而不是while循环,并减少变量的范围。这样可以产生更清晰,更惯用的编码风格:

import java.util.Random;

...

public static void main(String[] args) {
    Random rand = new Random();

    for (int c = 0; c < 100; ++c) {
        String randomNumberList = " ";
        int sum = 0;
        int counter = 0;
        for (int i = 0; i != 7; ++counter) {
            i = rand.nextInt(101);
            sum += i;
            randomNumberList += " " + i;
        }
        System.out.println("loop repeated " + counter+ " times and generated these numbers: " + randomNumberList);
    }
}

关于上述变化的一些注释:

  1. 你会发现截断的循环隐藏了一个错误,这个错误是由于你的变量在进入外循环之前只初始化了一次。范围缩小randomNumberListsumcounter修复此问题。
  2. 通常最好在行的末尾打印\n,而不是在开头,特别是在Unix上,将命令提示符放在最后一行输出的末尾,除非你终止最后一行换行。更好的是,使用println完全避免这个问题,如上所示。
  3. 如果要生成0到100之间的随机数,Random.nextInt()可以获得相同的结果而无需浮点数学和转换。