Эффективная реализация: «Python For Else Loop» в Java

В 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
}

Есть ли лучшая реализация, похожая на Python для цикла else в Java?

 fredoverflow07 нояб. 2013 г., 09:21
Вы можете заменитьif (finishedForLoop == true) сif (finishedForLoop), Не нужно проверять наtrue,if Заявление делает это неявно :)

Ответы на вопрос(5)

Нет, такого механизма нет в Java

Этосамый простой. Это'нетот сложно, этопросто синтаксис.

 tucuxi25 окт. 2012 г., 15:15
Кроме того, даже если вы найдете что-топроще», тоже будетумный", А также "умный" трудно читать
 Joe25 окт. 2012 г., 15:27
Я нене вижу чтоне умно использовать минимальный синтаксис. Чтобы ответить на ваш вопрос прямо, нет ничего проще и нет ничего умнее.
 Michael25 окт. 2012 г., 15:26
+1, да ты прав, мне все еще интересно большеумный" решения :-)

Когда мне нужно сделать что-то вроде этого, если никакой дополнительной информации не требуется, я обычно пытаюсь разбить ее на отдельный метод - который затем может вернуть /truefalse или, альтернативно, либо найденное значение, либо null, если оно 'не найдено Это невсегда работа - этоочень зависит от контекста - но этоСтоит попробовать.

Тогда вы можете просто написать:

for (...) {
    if (...) {
       return separateMethod();
    }
}
return null; // Or false, or whatever
 tucuxi29 окт. 2012 г., 16:54
для случаев, когда другой метод не идеален, вы всегда можетеразразиться" цикла, используя помеченный разрыв ... но это очень редко можно увидеть на практике.
Решение Вопроса

Это'сделано так:

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
 Eric07 нояб. 2013 г., 10:24
@FredOverflow: это 'не вырывается из цикла, а заключает в себе блок.
 fredoverflow07 нояб. 2013 г., 09:20
Почему помеченыbreak? Есть только одна петля, чтобы выйти из нее.
 Zecc07 нояб. 2013 г., 10:26
@FredOverflow Чтобы уточнить ЭрикаКомментарий: немаркированный разрыв будет продолжен для оператора, следующего за циклом, и все еще будет проходитьprintln заявление.

Поскольку java8 есть способ написать это с "почти нет код:

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

НО: это было бы менее эффективно, чем классический метод зацикливания с разрывом и флагом.

Ваш ответ на вопрос