Break-continue без вспомогательной логической переменной?

В Java у меня есть такой код:

boolean contains;
for (int i = 0; i < n; i++) {
    // get the current matrix value
    t = A[i][j];

    // check if it has been already considered
    contains = false;
    for (int z = 0; z < l; z++) {
        if (arrays[z].contains(t)) {
            contains = true; break;
        }
    }
    if (contains) continue;
    ...
}

Можно ли использовать метку, затем выпрыгнуть из внутреннего цикла и продолжить без логической переменной contains?

Мне нужно делать break-continue и не ломаться от всех петель.

2 ответа

Решение
outerLoop:
for (int i = 0; i < n; i++) {
    // get the current matrix value
    t = A[[i]][j];
    // check if it has been already considered
    for (int z = 0; z < l; z++) {
        if (arrays[z].contains(t)) {
            continue outerLoop;
        }
    }
}

Документация Oracle по маркированному ветвлению

Использование меток приводит к тому, что спагетти-код делает ваш код менее читабельным.

Вы можете извлечь внутренний цикл for в своем собственном методе, возвращая логическое значение:

private boolean contains(/* params */) {
    for (int z = 0; z < l; z++) {
        if (arrays[z].contains(t)) {
            return true;
        }
    }
}

и использовать его во внешнем цикле for

for (int i = 0; i < n; i++) {
    // get the current matrix value
    t = A[[i]][j];

    // check if it has been already considered
    if (contains(/*params*/)) 
        continue;
    ...
}
Другие вопросы по тегам