36

Pythonには、 ここで説明するelseループの効率的な実装があります

コード例:

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のelseループのPythonに似たより良い実装はありますか?

4

5 に答える 5

74

これは次のように行われます。

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
于 2013-06-24T17:51:53.990 に答える
15

このようなことをする必要があるとき、追加の情報が必要ない場合は、通常、それを別のメソッドに分割しようとします。このメソッドは、true/falseまたは見つかった値を返すか、見つからない場合はnullを返すことができます。常に機能するとは限りません-非常にコンテキスト固有です-しかし、試してみる価値はあります。

次に、次のように書くことができます。

for (...) {
    if (...) {
       return separateMethod();
    }
}
return null; // Or false, or whatever
于 2012-10-25T13:15:49.217 に答える
3

いいえ、それが最も簡単です。それほど複雑ではなく単なる構文です。

于 2012-10-25T13:14:38.380 に答える
1

java8以降、「ほぼノー」のコードでこれを記述する方法があります。

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

ただし、これは、従来のブレークとフラグを使用したループ方式よりも効率が低くなります。

于 2016-11-11T13:07:20.143 に答える
0

いいえ、Javaにはこのようなメカニズムはありません

于 2012-10-25T13:14:59.163 に答える