Эй, послушай, секрет двойного цикла FOR, которого ты не знал

задняя часть
Эй, послушай, секрет двойного цикла FOR, которого ты не знал

Предположительно все часто используют двухуровневый обход FOR, поэтому вы обнаружили следующие проблемы?

1. Обычный цикл

Во-первых, давайте посмотрим на следующий цикл

int k = 0; 
for(int i = 0; i < 10; i++){ 
    for(int j = 0; j < 6; j++){ 
        System.out.println(k++);//循环60次 
    } 
}

Сравните с этим

int k = 0;
for(int i = 0; i < 6; i++){
    for(int j = 0; j < 10; j++){
        System.out.println(k++);//循环60次
    }
}

60 циклов. Затем мы делаем следующее с циклом

2. Цикл массива

Давайте снова посмотрим на цикл массива

int[] a = {0,1,2,3,4,5,6,7,8,9};
int[] b = {0,1,2,3,4,5};
for(int i = 0; i < a.length; i++){
    for(int j = 0; j < b.length; j++){
        System.out.println(k++);//循环60次
    }
}

Сравните с этим

int[] a = {0,1,2,3,4,5,6,7,8,9};
int[] b = {0,1,2,3,4,5};
for(int i = 0; i < b.length; i++){
    for(int j = 0; j < a.length; j++){
        System.out.println(k++);//循环60次
    }
}

3. Практическое применение

Увидев это, вы думаете, что я несу чушь?

Что ж, давайте перейдем к делу, надеюсь, у вас не так много времени.

В сценариях практического применения мы не только закончили с двухуровневым циклом: например, мы хотим выполнить сравнение данных

int k = 0;
int[] a = {0,1,2,3,4,5,6,7,8,9};
int[] b = {0,1,2,3,4,5};
for(int i = 0; i < a.length; i++){
    for(int j = 0; j < b.length; j++){
        if(a[i] == b[j]){
            k++;
            break;//结束本次循环
        }
        k++;
    }
}
System.out.println("程序共循环" + k + "次");//

В этом цикле мы оцениваем, равны ли внешние данные внутренним данным, и добавляем break, чтобы завершить цикл (чтобы избежать бессмысленности).

Вывод программы:Всего программа повторяется 45 раз.

Затем я снова смотрю на эту программу:

int k = 0;
int[] b = {0,1,2,3,4,5,6,7,8,9};
int[] a = {0,1,2,3,4,5};
for(int i = 0; i < a.length; i++){
    for(int j = 0; j < b.length; j++){
        if(a[i] == b[j]){
            k++;
            break;//结束本次循环
        }
        k++;
    }
}
System.out.println("程序共循环" + k + "次");

Обратите внимание, что значения массивов a и b меняются местами;

Взгляните еще раз на вывод:Всего программа повторяется 21 раз.

Тогда возникает проблема, если мы не отрегулируем положение a и b.Мы помещаем внутреннюю петлю на внешний слой, и эффект одинаково;

Повторить 21 раз.

Кто-то может сказать, что это ничего. Но заметили ли мы эту проблему при написании реального кода? Поскольку количество циклов связано с производительностью программы

Собственно, вот почему такая большая разница:

int[] a = {0,1,2,3,4,5,6,7,8,9};
int[] b = {0,1,2,3,4,5};

Здесь массив b помещается во внешний слой, и значение, соответствующее внешнему слою, можно найти быстрее при зацикливании во внутреннем слое, после разрыва возникает разница.

Давайте изменим порядок значений массива b или поместим b во внешний слой

int k = 0;
int[] a = {0,1,2,3,4,5,6,7,8,9};
int[] b = {5,1,2,3,4,0};
for(int i = 0; i < b.length; i++){
    for(int j = 0; j < a.length; j++){
        if(b[i] == a[j]){
            k++;
            break;//结束本次循环
        }
        k++;
    }
}
System.out.println("程序共循环" + k + "次");

Вывод программы:Всего программа повторяется 21 раз.

смущение. Вроде бы порядок замены значения не имеет. я не согласен

int k = 0;
int[] a = {0,1,2,3,4,5,6,7,8,9};
int[] b = {5,2,4,3,1,0};
for(int i = 0; i < b.length; i++){
    for(int j = 0; j < a.length; j++){
        if(b[i] == a[j]){
            k++;
            break;//结束本次循环
        }
        k++;
    }
}
System.out.println("程序共循环" + k + "次");

Вывод программы:Всего программа повторяется 21 раз.

это не верно. изменить снова

int k = 0;
int[] a = {0,1,2,3,4,5,6,7,8,9};
int[] b = {5,1,3,4,2,0};
for(int i = 0; i < b.length; i++){
    for(int j = 0; j < a.length; j++){
        if(b[i] == a[j]){
            k++;
            break;//结束本次循环
        }
        k++;
    }
}
System.out.println("程序共循环" + k + "次");

Вывод программы:Всего программа повторяется 21 раз.

В конце концов было обнаружено, что цикл, изменяющий только один массив, не меняет количество циклов. Количество циклов можно изменить, только изменив порядок обоих массивов одновременно.

Сегодня в развитии бизнеса я столкнулся с этой проблемой, запишите ее здесь и предупредите о будущем развитии.