未分類

腦力激盪玩一下JDK5.0的新語法 – foreach

最近公司內訓 java,老師給我們的一題foreach的作業,第一次看到覺得蠻新鮮的,我來介紹一下。

foreach 是 java JDK5.0以後才有新語法,這種語法Compiler真正在編譯時還會改成原始的語法,這種情況俗稱”Compiler Sugar”。

先看一段 foreach 的基本語法:

public class Test2 {

public static void main(String[] args) {

        int [] a = {0,1,2,3,4,5,6,7,8,9};
        for(int i : a)
            System.out.print(a[i] + ” “);
        }

}

a 是一維陣列,for() 裡面用冒號分隔,這語法會自動將 a 陣列中的元素依依提出來,用 int i 來接每個元素內容,所以印出來結果如下。
0 1 2 3 4 5 6 7 8 9

 

題目是三維陣列

public class Test1 {
    public static void main(String[] args) {
       

      // 三維陣列,依依填入數值
      int[][][] a = new int[10][10][10];
        for(int i = 0; i<a.length; i++) {
            for(int j=0; j<a[i].length; j++) {
                for(int k=0; k<a[i][j].length; k++) {
                    a[i][j][k] = 100*i+10*j+k;
                }
            }
        }

   // a 陣列裡面填什麼值不需要管,下面是傳統 for loop 作法把全部值列印出來
   for(int i = 0; i<a.length; i++) {
            for(int j=0; j<a[i].length; j++) {
                for(int k=0; k<a[i][j].length; k++) {
                    System.out.print(a[i][j][k]+” “);
                }               
            }
     }
 /* 題目是如何將上頭列印 a 三維陣列的值,語法用 foreach 改寫?
       語法會差不多是長這樣
       for(  :  ) {
            for(  :  ){
                for( :  ) {
                    System.out.print( + ” “);
                }               
            }       
         }

    */

一下頁看解答

答案是:

for(int [][] i:  a) {
    for(int [] j : i ){
        for(int k: j ) {
            System.out.print(k+ ” “);
        }
    }
}

說明:從最外層的 for 迴圈開始看,a[][][]是一個三維的陣列,以這題來講每維都有10個元素,這隱含著這三維陣列是由10個二維陣列組成的,所以最外層的 for( : ) 冒號的右邊是三維陣列的 a[][][],左邊就應該要是二維陣列的 int [][] i去接,接著再看第二層 for,第二層的 for 要處理的是二維陣列的 i [][],一樣的道理每維都有10個元素,也隱含著 i[][] 是由10個一維陣列所組成的,for( : )冒號的右邊是二維陣列的 i [][] 的話,冒號左邊應該是要一個一維陣列去接吧,這裡就用了 int [] j 去接,到了最裡面的第三層 for,j [] 是一維陣列,大家對一維陣列最熟悉不過的了,這裡同樣一維有10個元素,每個元素就用 int k 去接它的值,所以 k 已經是真正的值了喔,所以依依把 k 印出來就可以了。

其實這個 例子用了三維陣列,每維陣列都是10,但是其實 foreach 最大的好處就是不用去管陣列每一維的長度,就算是 10X20X30的陣列,這樣的寫法照樣也行得通。

那 foreach 也有壞處,壞處就是看不習慣吧,後人維護你的程式碼會比較辛苦,這種語法自己玩可以,合作型的開發案最好還是以傳統熟悉的語法,看得比較懂的語法為主啦。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *