1. 程式人生 > 實用技巧 >仗劍走天涯——『錯誤收錄』

仗劍走天涯——『錯誤收錄』

for—each 不能操作元素本身

我的需求

  將只包含 1和0 的二維陣列的所有元素反置,即所有1變成0、0變成1。

  原始陣列:

我的做法

  使用for—each運算元組:

public class test {

    public static void main(String[] args) {
        int[][] array = {{0,0,1,1},{1,0,1,0},{1,1,0,0}};
        
        // for-each 操作
        for(int[] arr : array) {
            for(int k : arr) {
                k 
^= 1; } } } }

  乍一看,沒啥問題。

  但是,我們來看看操作後的陣列:

  陣列元素完全沒有變化,和原始陣列一模一樣。

  查了一下,for—each的底層實現是迭代器,就是在迴圈中拿到的是每一個元素的值(可以理解為拷貝其值),而不是每一個元素本身。

  因此,我們並不能使用for—each來對陣列元素本身進行操作,只能使用陣列元素本身。

正確的做法

  使用正常的for迴圈,來對陣列元素本身進行操作:

public class test {

    public static void main(String[] args) {
        
int[][] array = {{0,0,1,1},{1,0,1,0},{1,1,0,0}}; // for迴圈操作 for(int i=0; i<array.length; i++) { for(int j=0; j<array[i].length; j++) { array[i][j] ^= 1; } } // 遍歷 for(int[] arr : array) { for(int k : arr) { System.out.print(k
+ " "); } System.out.println(); } } }

執行結果:

結論

  for—each的底層實現是迭代器,只適合拿到元素的值,然後進一步操作的情況,它並不能影響元素本身,不適合對元素本身進行操作的情況。

  持續跟新中。。。