2012-10-25 25 views
22

Trong Python có một hiệu quả để thực hiện vòng lặp khác được mô tả herethực hiện hiệu quả cho: "Python Đối Else Loop" trong Java

Ví dụ mã:

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' 

Trong Java Tôi cần phải viết mã hơn để đạt được cùng một hành vi:

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

Có triển khai nào tốt hơn tương tự như Python cho vòng lặp khác trong Java không?

+4

Bạn có thể thay thế 'if (finishedForLoop == true)' bằng 'if (finishedForLoop)'. Không cần phải kiểm tra 'true', câu lệnh' if' thực hiện điều đó một cách ngầm định :) – fredoverflow

Trả lời

47

Nó làm như thế này:

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

Tại sao nhãn 'ngắt'? Chỉ có một vòng lặp để thoát ra khỏi. – fredoverflow

+15

@FredOverflow: nó không phá vỡ vòng lặp, nhưng khối bao quanh. – Eric

+2

@FredOverflow Để xây dựng trên nhận xét của Eric: một ngắt không gắn nhãn sẽ tiếp tục trên câu lệnh theo sau vòng lặp và vẫn chảy qua câu lệnh 'println'. – Zecc

2

No. Đó là cách đơn giản nhất. Nó không phải là rằng phức tạp, nó chỉ là cú pháp.

+2

cũng vậy, ngay cả khi bạn tìm thấy cái gì đó "đơn giản", nó cũng sẽ "thông minh". Và "thông minh" khó đọc – tucuxi

+0

+1, Có bạn đúng, tôi vẫn quan tâm đến các giải pháp "thông minh" hơn :-) – Michael

+0

Tôi không thấy điều gì không thông minh về việc sử dụng cú pháp tối thiểu. Để trả lời câu hỏi của bạn thẳng, không có gì đơn giản hơn và không có gì thông minh hơn. – Joe

1

Không, không có cơ chế như thế này trong Java

11

Khi tôi cần phải làm một cái gì đó như thế này, nếu không có thông tin thêm là cần thiết, tôi thường cố gắng phá vỡ nó ra thành một phương pháp riêng biệt - mà sau đó có thể trở lại true/false hoặc cách khác hoặc tìm thấy giá trị hoặc null nếu không tìm thấy. Nó không luôn luôn hoạt động - nó rất cụ thể về ngữ cảnh - nhưng đó là điều đáng thử.

Sau đó, bạn chỉ có thể viết:

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

+1, tôi thích đề xuất của bạn, Cảm ơn – Michael

+0

cho các trường hợp khi một phương pháp khác không lý tưởng, bạn luôn có thể "thoát" vòng lặp bằng cách sử dụng dấu ngắt ... nhưng rất hiếm khi thấy điều này trong thực tế. – tucuxi

1

Kể từ java8 có một cách để viết những dòng này với "gần như không có" mã :

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

NHƯNG: điều này sẽ kém hiệu quả hơn phương pháp vòng lặp-với-ngắt-và-cờ cổ điển.

Các vấn đề liên quan