2012-10-25 10 views
22

W Pythonie istnieje skuteczny do realizacji innego pętli opisane hereSkuteczna realizacja wg: „Pythona do Else Pętla” w Javie

Przykładowy kod:

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' 

W Javie Muszę napisać więcej kodu Aby osiągnąć to samo zachowanie:

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

Czy istnieje lepsza implementacja podobna do Pythona dla innej pętli w Javie?

+4

Możesz zastąpić 'if (finishedForLoop == true)' z 'if (finishedForLoop)'. Nie ma potrzeby testowania dla 'prawda', instrukcja' if' robi to niejawnie :) – fredoverflow

Odpowiedz

47

To się robi tak:

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

Dlaczego oznaczone "break"? Jest tylko jedna pętla do przełamania. – fredoverflow

+15

@FredOverflow: nie wychodzi z pętli, ale zamyka blok. – Eric

+2

@FredOverflow Aby rozwinąć komentarz Eric: przerwa nienaświetlona będzie kontynuowana w instrukcji następującej po pętli i nadal przepływa przez instrukcję 'println'. – Zecc

2

Nie. To najprostsze. To nie jest skomplikowane, to tylko składnia.

+2

również, nawet jeśli znajdziesz coś "prostszego", będzie również "inteligentne". I "smart" jest trudny do odczytania – tucuxi

+0

+1, tak masz rację, nadal jestem zainteresowany bardziej "inteligentnymi" rozwiązaniami :-) – Michael

+0

Nie widzę, co nie jest mądre w użyciu minimalnej składni. Aby odpowiedzieć na twoje pytanie prosto, nie ma nic prostszego i nie ma nic mądrzejszego. – Joe

11

Kiedy muszę zrobić coś takiego, gdyby nie dodatkowa informacja jest potrzebna, ja zazwyczaj starają się złamać go do osobnego sposobu - które następnie powrót true/false lub alternatywnie albo znalezioną wartość, albo null, jeśli nie zostanie znaleziona. Nie zawsze pracuje - jest to ściśle związane z kontekstem - ale jest to coś, co warto wypróbować.

Następnie można po prostu napisać:

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

+1, podoba mi się twoja sugestia, Dzięki – Michael

+0

dla przypadków, gdy inna metoda nie jest idealna, zawsze możesz "wyrwać się" z pętli przy użyciu oznaczonej przerwy ... ale bardzo rzadko jest to widoczne w praktyce. – tucuxi

1

Od java8 istnieje sposób, aby napisać to z "prawie nie ma" kodu :

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

ALE: Byłoby to mniej wydajne niż metoda klasycznych pętli z przerwą i flagą.