2012-10-25 10 views
22

In Python gibt es eine effiziente für andere Schleife Implementierung ist beschrieben hereEffiziente Umsetzung für: "Python für Else Loop" in Java

Beispielcode:

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' 

In Java Ich brauche mehr Code zu schreiben Um das gleiche Verhalten zu erreichen:

Gibt es eine bessere Implementierung ähnlich wie Python für else-Schleife in Java?

+4

Sie können 'if (finishedForLoop == true)' durch 'if (finishedForLoop)' ersetzen. Es ist nicht notwendig, nach 'true' zu ​​suchen, die 'if'-Anweisung macht das implizit :) – fredoverflow

Antwort

47

es so gemacht wird:

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 
+3

Warum die beschriftete "Pause"? Es gibt nur eine Schleife, aus der man ausbrechen kann. – fredoverflow

+15

@FredOverflow: Es bricht nicht aus der Schleife heraus, sondern der umschließende Block. – Eric

+2

@FredOverflow Um Erics Kommentar zu erläutern: Eine unbenannte Unterbrechung würde in der Anweisung fortgesetzt, die der Schleife folgt und immer noch durch die Anweisung 'println' fließt. – Zecc

2

Nein. Das ist das einfachste. Es ist nicht , dass kompliziert, es ist nur Syntax.

+2

Auch wenn Sie etwas" einfacheres "finden, wird es auch" smart "sein. Und "smart" ist schwer zu lesen – tucuxi

+0

+1, Ja, Sie haben Recht, ich bin immer noch interessiert an mehr "Smart" -Lösungen :-) – Michael

+0

Ich sehe nicht, was nicht schlau über die Verwendung der minimalen Syntax ist. Um Ihre Frage direkt zu beantworten, nein es gibt nichts einfacher und es gibt nichts schlauer. – Joe

1

Nein, es gibt keinen Mechanismus, wie dies in Java

11

Wenn ich brauche so etwas zu tun, wenn keine zusätzliche Informationen benötigt werden, versuche ich es typischerweise in ein separates Verfahren zu durchbrechen - die dann Rückkehr true/false oder alternativ entweder der gefundene Wert oder null, wenn er nicht gefunden wird. Es funktioniert nicht immer Arbeit - es ist sehr kontextspezifisch - aber es ist etwas wert, es zu versuchen.

Dann können Sie einfach schreiben:

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

+1, Ich mag Ihren Vorschlag, Danke – Michael

+0

für Fälle, wenn eine andere Methode nicht ideal ist, können Sie immer aus der Schleife mit einer markierten Pause "ausbrechen" ... aber es ist sehr selten, dies in der Praxis zu sehen. – tucuxi

1

Seit java8 gibt es einen Weg, dies zu schreiben mit "fast nicht" Code :

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

ABER: Dies wäre weniger effizient als die klassische Methode Schleifen mit Bruch und Flag.