2012-10-25 17 views
22

In Python c'è un efficace per l'attuazione altro ciclo descritto hereefficiente implementazione per: "Python per Else Loop" in Java

codice Esempio:

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 ho bisogno di scrivere codice più per ottenere lo stesso comportamento:

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

Esiste un'implementazione migliore simile a Python per il ciclo alternativo in Java?

+4

È possibile sostituire 'if (finishedForLoop == true)' con 'if (finishedForLoop)'. Non c'è bisogno di testare per 'true', l'istruzione' if' lo fa implicitamente :) – fredoverflow

risposta

47

E 'fatta così:

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

Perché l'etichetta 'break'? C'è solo un ciclo da cui uscire. – fredoverflow

+15

@FredOverflow: non sta uscendo dal ciclo, ma dal blocco che lo racchiude. – Eric

+2

@FredOverflow Per elaborare il commento di Eric: un'interruzione senza etichetta continua con l'istruzione che segue il ciclo e scorre ancora attraverso l'istruzione 'println'. – Zecc

2

No. Questo è il più semplice. Non è quello complicato, è solo sintassi.

+2

anche, anche se trovi qualcosa di "più semplice", sarà anche "intelligente". E "intelligente" è difficile da leggere – tucuxi

+0

+1, sì hai ragione, sono ancora interessato a più soluzioni "intelligenti" :-) – Michael

+0

Non vedo cosa non sia intelligente nell'usare la sintassi minima. Per rispondere direttamente alla tua domanda, non c'è niente di più semplice e non c'è niente di più intelligente. – Joe

1

No, non esiste un meccanismo come questo in Java

11

Quando ho bisogno di fare qualcosa di simile, se non è necessaria alcuna informazione in più, io di solito cerco di rompere fuori in un metodo separato - che possono poi ritorno true/false o alternativamente il valore trovato o null se non trovato. Non è sempre lavoro - è molto specifico per il contesto - ma è qualcosa che vale la pena provare.

Poi si può solo scrivere:

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

+1, mi piace il tuo suggerimento, grazie – Michael

+0

per i casi in cui un metodo diverso non è l'ideale, puoi sempre "uscire" dal ciclo usando una pausa etichettata ... ma è molto raro vederlo in pratica. – tucuxi

1

Dal java8 c'è un modo per scrivere questo con il codice "quasi nessun" :

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

BUT: questo sarebbe meno efficiente del classico metodo loop-con-break-and-flag.

Problemi correlati