嘿,看過來,你不知道的雙層FOR迴圈的祕密

hellohellolady_86404發表於2018-04-19

想必大家都經常用雙層FOR遍歷,那麼你是否發現下面這些問題呢?

一、普通迴圈

首先我們來看下面的迴圈

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次。那麼我們帶著個迴圈做下面的操作

二、陣列迴圈

我們再來看陣列迴圈

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次
    }
}複製程式碼

三、實際應用

看到這裡,你是不是覺得我上面在講廢話?

好吧,進入正題,希望耽擱你的時間不多。

我們在實際應用場景中不僅僅是雙層迴圈一下就完了:比如我們要進行資料比對

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陣列放在外層,在內層迴圈的時候可以更快的找到與外層對應的值,經過break,差異就這麼發生了。

我們來改變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次

最後發現,只改變一個陣列的迴圈並不能改變迴圈次數。只有同時改變兩個陣列的順序才能改變迴圈次數。

今天在一次業務開發中,遇到這個問題,在此記下來,為後面的開發做個警示


相關文章