【问题标题】:Efficient implementation for: "Python For Else Loop" in Java高效实现:Java 中的“Python For Else Loop”
【发布时间】:2012-10-15 16:25:58
【问题描述】:

在 Python 中,描述了一个高效的 for else 循环实现 here

示例代码:

for x in range(2, n):
    if n % x == 0:
        print n, 'equals', x, '*', n/x
        break
else:
    # loop fell through without finding a factor
    print n, 'is a prime number'

在 Java 中,我需要编写更多代码来实现相同的行为:

finishedForLoop = true;
for (int x : rangeListOfIntegers){
    if (n % x == 0)
    {
        //syso: Some printing here
        finishedForLoop = false
        break;
    }
}
if (finishedForLoop == true){
    //syso: Some printing here
}

在Java中有没有更好的类似于Python for else循环的实现?

【问题讨论】:

  • 您可以将if (finishedForLoop == true) 替换为if (finishedForLoop)。无需测试trueif 语句会隐式执行此操作:)

标签: java python if-statement for-loop


【解决方案1】:

这样做是这样的:

class A {
    public static void main(String[] args) {
        int n = 13;
        found: {
            for (int x : new int[]{2,3,4,5,6,7,8,9,10,11,12})
                if (n % x == 0) {
                    System.out.println("" + n + " equals " + x + "*" + (n/x));
                    break found;
                }
            System.out.println("" + n + " is a prime number");
        }
    }
}

$ javac A.java && java A
13 is a prime number

【讨论】:

  • 为什么标记为break?只有一个循环可以打破。
  • @FredOverflow:它不是跳出循环,而是封闭块。
  • @FredOverflow 详细说明 Eric 的评论:未标记的中断将在循环之后的语句上继续,并且仍流经 println 语句。
【解决方案2】:

当我需要做这样的事情时,如果不需要额外的信息,我通常会尝试将其分解为一个单独的方法 - 然后可以返回 true/false 或者找到的值,或者如果未找到,则为 null。它并不总是有效 - 它是非常特定于上下文的 - 但它值得一试。

那么你可以写:

for (...) {
    if (...) {
       return separateMethod();
    }
}
return null; // Or false, or whatever

【讨论】:

  • 对于其他方法不理想的情况,您始终可以使用标记的 break 来“跳出”循环......但在实践中很少看到这种情况。
【解决方案3】:

没有。这是最简单的。 并不复杂,只是语法而已。

【讨论】:

  • 另外,即使你发现一些“更简单”的东西,它也将是“智能”的。而且“聪明”很难读懂
  • +1,是的,你是对的,我仍然对更多“智能”解决方案感兴趣:-)
  • 我看不出使用最小语法有什么不明智的。直接回答你的问题,没有什么比这更简单,也没有什么比这更聪明了。
【解决方案4】:

从 java8 开始,有一种方法可以用“几乎没有”的代码来编写:

if(IntStream.range(2, n).noneMatch(x -> n % x == 0)) {
   System.out.println(n + " is a prime number");
}

但是:这将比经典的循环中断和标志方法效率低。

【讨论】:

    【解决方案5】:

    不,Java中没有这样的机制

    【讨论】:

      猜你喜欢
      • 2014-06-02
      • 2013-04-20
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      • 2019-05-14
      • 2018-09-12
      • 2015-09-22
      • 1970-01-01
      相关资源
      最近更新 更多