2012-04-17 19:03:24Morris

[JAVA] foreach 的陷阱

必須了解 for-each 是無法做修改值的,僅能提供讀的功能。

為什麼有感而發呢 ?
小考出了這麼兩小題。
  • 宣告一個 int 的陣列, 名稱為 value, 元素個數 10 個, 並用 for 迴圈宣告成 1 ~ 10
  • 利用 for-each loop 將每個元素值乘兩倍
這個題目, 經過講述, 第二小題本應該是沒有解答的!
但是看看下列程式碼, 解答仍是存在的!

public class Test {
    public static void main(String[] args) {
        int[] value = new int[10];
        for(int i = 0; i < value.length; i++) {
            value[i] = i+1;
        }
        for(int i = 0; i < value.length; i++)
            System.out.printf(" %d", value[i]);
        System.out.println("");
        for(int element : value) {
            value[element-1] = element*2;
        }
        for(int i = 0; i < value.length; i++)
            System.out.printf(" %d", value[i]);
        System.out.println("");
    }
}

範例輸出 :
 1 2 3 4 5 6 7 8 9 10

 2 4 6 8 10 12 14 16 18 20
aaa 2013-03-12 11:07:21

不小心看到這篇~~好奇研究了一下你的方法

還蠻 tricky 的....

不過這個方法只成立在陣列數值為1~N的情況

一般 foreach 的寫法會提供抓取 index 的方式
但是Java不支援,有可能是因為當初設計只是要用來讀取資料用,而非修改。

查了一下網路上比較推薦的方式是 keep the index
也就是說
int index=0 ;
for(int element : value) {
value[index++] = element*2;
}

版主回應
是,我的以前做法並不好。
不過這樣的話,也沒有必要寫 foreach 了。
2013-03-12 19:33:28