Почему цикл не прекращается командной break?

104
10 июня 2021, 12:30

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

почему на matrix[0][1] , когда идет сравнение с matrix[0][2] - цикл не прекращает свое сравнение, а проверяет дальше следующие массивы {5, 4, 3}, {8, 7, 6}}. Хотя я специально обозначил, что в случае нарушения убывания значений элементов массива - пойдет break.

public static void main(String[] args) throws Exception{
        int[][] matrix = {{3, 2, 2}, {5, 4, 3}, {8, 7, 6}};
        int bolshe;
        boolean isSortedDescendant = false;
        if (matrix.length == 0){
            isSortedDescendant = true;
        } else {
            for (int i = 0; i < matrix.length; i++) {
                bolshe = matrix[i][0];
                for (int j = 0; j < matrix[i].length-1; j++) {
                    if (bolshe > matrix[i][j+1]) {
                        bolshe = matrix[i][j+1];
                        isSortedDescendant = true;
                    } else if (bolshe <= matrix[i][j+1]){
                        isSortedDescendant = false;
                        break;    
                    }
                }
            }
        }
        System.out.println(isSortedDescendant);
    }   
}
Answer 1

Обратите внимание, что у вас вложенный цикл. При использовании внутри набора вложенных циклов оператор break будет выходить только из самого внутреннего цикла. Для решения данной задачи стоит воспользоваться метками break outer;

public static void main(String[] args) throws Exception{
int[][] matrix = {{3, 2, 2}, {5, 4, 3}, {8, 7, 6}};
    int bolshe;
    boolean isSortedDescendant = false;
    if (matrix.length == 0){
        isSortedDescendant = true;
    } else {
    outer: // Ставим метку
        for (int i = 0; i < matrix.length; i++) {
            bolshe = matrix[i][0];
            for (int j = 0; j < matrix[i].length-1; j++) {
                if (bolshe > matrix[i][j+1]) {
                    bolshe = matrix[i][j+1];
                    isSortedDescendant = true;
                } else if (bolshe <= matrix[i][j+1]){
                    isSortedDescendant = false;
                    break outer; // Переходим к метке

                }
            }
        }
    }
    System.out.println(isSortedDescendant);
   }

Замечание: Break не проектировался в качестве нормального средства завершения цикла. Эту цель обслуживает условное выражение заголовка цикла. Оператор break следует использовать для прерывания цикла только тогда, когда возникают некоторые специальные ситуации.

READ ALSO
Transition числовых меток в bar chart d3

Transition числовых меток в bar chart d3

Я изучаю d3js, и у меня есть вопрос:

125
Node js сохранение полученного zip архива

Node js сохранение полученного zip архива

С клиента получаю архив в base64, перевожу в utf, сохраняю, но архив оказывается битымОшибка и код ниже

89
Как связать добавляемые метки линиями?

Как связать добавляемые метки линиями?

При нажатии кнопки в центре карты появляется метка, нужно, чтобы новые метки были соединены с последней добавленной и при этом их все можно...

98
Почему не работает event.preventDefault()

Почему не работает event.preventDefault()

Почему не работает eventpreventDefault();?

85