【问题标题】:Java: elegant for-loop with extra stop conditionJava:带有额外停止条件的优雅 for 循环
【发布时间】:2016-06-21 04:09:30
【问题描述】:

我们希望循环到达某个索引或无休止地运行。
所以我们有一个属性 loopCount 可以大于 0 OR -1。

我们想要一个有 2 个停止条件的循环:
1. 到达 loopCount
2. 无休止 - loopCount == -1。

所以这里是代码:

for (int i = 0; (loopCount == -1 || i < loopCount) ; i++) {
   doSomething();
}

不优雅的是,如果
loopCount == -1
i 继续增长,可能会达到 INT_MAX。

有什么更优雅的方法吗?

【问题讨论】:

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


    【解决方案1】:

    为什么不利用|| 短路这一事实?

    使用

    for (int i = 0; loopCount == -1 || i++ < loopCount; /*intentionally blank*/) {
    

    这样,i 只会增加 如果 loopCountnot -1,而且我已经足够小心地使用 i++ 而不是 @ 987654326@.

    我也去掉了不必要的括号。

    【讨论】:

    • 您问“为什么不利用 || 短路的事实?”。我的回答是:让代码更清晰易读并避免副作用......比如在条件检查中增加变量。
    • 来自 C 和 C++ 世界,这种东西是惯用的。这不是你知道的 VBA。但我尊重反对票。
    • 不,它不是 VBA。它是 Java。
    【解决方案2】:

    考虑将其分成两个循环:

    while(loopCount == -1){
        doSomething();
    }
    for (int i = 0; i < loopCount ; i++) {
        doSomething();
    }
    

    如果 loopCount = -1 那么你将有一个无限的 while 循环并且永远不会执行 for 循环。如果 loopCount > 0,while 循环将被忽略,只执行 for 循环。

    【讨论】:

    • 加一;以牺牲优雅为代价的卓越的可维护性。再想一想,这并非不雅。
    【解决方案3】:

    不确定这是否足够优雅......但要使其简单易读并且全部在一行中

    for (int i = 0; (loopCount == -1 || i < loopCount) ;  i = (loopCount > 0) ? i++ : i) {
        doSomething();
      }
    

    【讨论】:

      【解决方案4】:
      int i = 0;
      while(i == -1 || i < loopCount) {
          doSomething();
          if(i != -1)
              i++;
      }
      

      在 i == -1 时无限运行,但仅在它不是无限循环的情况下累加,避免 i 达到 INT_MAX。

      【讨论】:

        【解决方案5】:

        为了提高可读性并避免短路评估,您可以考虑此解决方案

        final int loopCount = 3; // -1
        final boolean endlessly = (loopCount == -1);
        
        int i = 0;
        while (endlessly ? true : i++ < loopCount) {
            doSomething(i);
        }
        

        如果loopCount为-1,则while (true)将无限执行。否则while (i++ &lt; loopCount) 并且循环在计数循环后停止。这里唯一的缺点是,icounts 从13。在无休止的情况下,i 保持不变。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-03
          • 1970-01-01
          • 2016-04-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多