最近公司內訓 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 也有壞處,壞處就是看不習慣吧,後人維護你的程式碼會比較辛苦,這種語法自己玩可以,合作型的開發案最好還是以傳統熟悉的語法,看得比較懂的語法為主啦。