高效实现:Java 中的“Python For Else Loop”

Posted

技术标签:

【中文标题】高效实现:Java 中的“Python For Else Loop”【英文标题】:Efficient implementation for: "Python For Else Loop" in Java 【发布时间】: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 语句会隐式执行此操作:) 【参考方案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中没有这样的机制

【讨论】:

以上是关于高效实现:Java 中的“Python For Else Loop”的主要内容,如果未能解决你的问题,请参考以下文章

Java中的缓冲流

实现一个简单的 Trie 以实现高效的 Levenshtein 距离计算 - Java

java中的集合与映射

java字符串替换函数高效实现

Java高效实现python切片操作

Java引用js代码实现高效动态机制