【问题标题】:Print Message Once Every Million Iterations每百万次迭代打印一次消息
【发布时间】:2013-04-16 13:27:01
【问题描述】:

我需要编写一个循环,每百万次迭代打印一次消息。我想让它运行 10 秒(时钟时间),看看打印了多少条语句。

我想我现在只是把自己打结了……

public class OneInAMillion{
  public static void main(String []args){
    long startTime = System.currentTimeMillis();  //time at start of execution
    long endTime = startTime + 10000;  //time at end of execution (10000 = 10 seconds)
    int count = 1;

    while(System.currentTimeMillis() < endTime) { //run this before 10 seconds is up
      for (int i = 0; i < count; i++) {
        if(i % 1000000 == 0) {
            System.out.println("Iteration: " + count++);  //print every millionth iteration
        }
      }
    }

    System.out.println("Time up!"); //print once loop finishes
  }
}

【问题讨论】:

  • 有什么问题?是否有错误,或者它只是不起作用?你试过什么?
  • 你只能使用while循环并在里面增加i。

标签: java loops for-loop while-loop iteration


【解决方案1】:

你在循环中有一个循环。想想每个循环的作用——第一个循环会一直持续到 10 秒。另一个将简单地从 0 开始变为 1,在 while 循环的下一次迭代中,它将从 0 变为 2,然后从 0 变为 3,依此类推。当它为 0(很多)时它也会打印,因为 0%1000000 是 0。

尝试将它们组合成一个循环。这可以通过摆脱 while 循环并仅使用带有 while 循环条件的 for 循环来完成,如下所示:

  public static void main(String[] args) {
     long endTime = System.currentTimeMillis() + 10000;  //time at end of execution (10000 = 10 seconds)
     for (int i = 1; System.currentTimeMillis() < endTime; i++) {
        if(i % 1000000 == 0) {
            System.out.println("Iteration: " + i/1000000);  //print every millionth iteration
        }
      }
      System.out.println("Time up!"); //print once loop finishes
  }

请注意,count 将始终是 i/1000000,所以我去掉了它。

【讨论】:

  • 这似乎是迄今为止最合乎逻辑的推理,但它仍然没有打印“时间到了!”消息,并且每次运行代码时都会得到截然不同的结果。
  • @samwhocan 只需将其替换为您的 while 循环以及其中的内容,而不是之前或之后的代码,它就会起作用 =)
  • 感谢您迄今为止的建议。但是仍然无法正常工作...打印“错误!”多次! long startTime = System.currentTimeMillis();长结束时间 = 开始时间 + 10000;整数计数 = 1; for (int i = 1; System.currentTimeMillis()
  • 想想吧。每次 i % 1000000 不正确时(每次从 1000000、2000000、3000000 等迭代一个部分时),它将转到 else 子句。每次它转到 else 子句时,它都会打印“错误!”,当然,正如您这样定义的。只需删除 else 子句和错误打印。
  • 好吧。我在那里看到了我的错误,但现在它与以前一样,因为它随机打印出“迭代:n”并且无法到达“时间到了!”确认 10 秒结束的消息。
【解决方案2】:

摆脱您的for 循环,在您的if 之前执行i++ 并打印i 而不是count,您应该设置好。

public class OneInAMillion{
  public static void main(String []args){
    long startTime = System.currentTimeMillis();  //time at start of execution
    long endTime = startTime + 10000;  //time at end of execution (10000 = 10 seconds)
    //int count = 1;
    int i = 0;
    while(System.currentTimeMillis() < endTime) { //run this before 10 seconds is up
        i++;
        if(i % 1000000 == 0) {
            System.out.println("Iteration: " + i);  //print every millionth iteration
        }
    }

    System.out.println("Time up!"); //print once loop finishes
  }
}

【讨论】:

  • 如果有代码示例,这个答案会更好。
【解决方案3】:

您的 for 循环退出条件会干扰您的 while 循环退出条件,并阻止它在您期望的时候被评估。摆脱 while 循环:

public class OneInAMillion{
  public static void main(String []args){
    long startTime = System.currentTimeMillis();  //time at start of execution
    long endTime = startTime + 10000;  //time at end of execution (10000 = 10 seconds)
    int count = 1;

    for (int i = 0; i < count; i++) {
      if(System.currentTimeMillis() >= endTime) {
        break;
      }

      if(i % 1000000 == 0) {
        System.out.println("Iteration: " + count++);  //print every millionth iteration
      }
    }


    System.out.println("Time up!"); //print once loop finishes
  }
}

【讨论】:

  • 您的整个 for 循环相当于 if 语句 (0 % 1000000 == 0)。它只会迭代一次,这不是 OP 想要的。
  • 是的,我的 for 循环退出条件错误;你的答案是我的目标。 :}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-30
  • 2019-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-12
相关资源
最近更新 更多