Rust與Java程式碼比較:將二維陣列轉為三維陣列

banq發表於2022-11-05

在我們繼續 Rust 之前,這是我可以用 Java 編寫的簡單程式碼(花不到五分鐘的時間)

import java.util.Arrays;

public class Demo {

    public static void update2dArray(int[][] array) {
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                array[i][j] = 100;
            }
        }
    }

    public static void main(String[] args) {
        int[][] array = new int[10][10]; //by default, initial values = 0
        System.out.println("Before change");
        Arrays.stream(array).forEach(row -> Arrays.stream(row).forEach(item -> System.out.print(" " + item)));
        update2dArray(array);
        System.out.println("\nAfter change");
        Arrays.stream(array).forEach(row -> Arrays.stream(row).forEach(item -> System.out.print(" " + item)));

        int[][] newArray = new int[20][20]; // size is 20x20
        update2dArray(newArray);
        System.out.println("\nAfter change");
        Arrays.stream(newArray).forEach(row -> Arrays.stream(row).forEach(item -> System.out.print(" " + item)));

    }
}

可以看到,在 Java 中,更新 2d 陣列(或 3d 陣列)自然很容易。你只需要建立一個函式,然後這個函式將一個二維陣列作為引數。然後迴圈遍歷陣列的所有元素並更改每個元素的值。最後,當您返回主函式時,您將擁有一個更新的陣列。
一個重要的注意事項是 update_2d 函式可以接收任何大小的二維陣列。

作為一個內心深處有 Java的 開發人員,我想我會在 Rust 中做同樣的事情,如下所示:

fn update_2d_array(arr: &mut [[u32; 10]; 10]) {
    for i in 0..arr.len() {
        for j in 0..arr[i].len() {
            arr[i][j] = 10;
        }
    }
}
fn main() {
    let mut array_2d = [[0;10]; 10];
    println!("Before: {:?}", array_2d);
    update_2d_array(&mut array_2d);
    println!("After: {:?}", array_2d);
}


Rust 版本執行良好……但有一個問題,函式 update_2d_array 需要指定矩陣的寬度和高度……。

那麼如何在執行時更新二維動態大小陣列呢?
在谷歌上搜尋了很多之後,我花了 3 個小時才找到答案。我們必須使用AsMut Trait,並建立一個新的資料型別V:AsMut<[u32]。您只需要記住 V 作為矩陣每一行的可變引用。

use std::array;


fn update_2d_array(array: &mut [[u32; 10]; 10]) {
    for i in 0..array.len() {
        for j in 0..array[i].len() {
            array[i][j] = 100;
        }
    }
}

//AsMut trait
fn update_2d_array_with_asmut<V: AsMut<[u32]>>(array: &mut [V]) {
    for i in 0..array.len() {
        for j in 0..array[i].as_mut().len() {
            array[i].as_mut()[j] = 200;
        }
    }
}

fn main() {
    let mut array_2d = [[0; 10]; 10]; // 10 x 10;
    println!("Before {:?}", array_2d);

    update_2d_array(&mut array_2d);
    println!("After {:?}", array_2d);

    update_2d_array_with_asmut(&mut array_2d);
    println!("After AsMut {:?}", array_2d);

    let mut array_2d_30 = [[0; 30]; 30];
    update_2d_array_with_asmut(&mut array_2d_30);
    println!("After AsMut 30: {:?}", array_2d_30);
}


透過這樣做,我只是想展示一個例子,學習 Rust 不像 Python 或 Java 等其他語言那樣容易……要操作 2d/3d 陣列,我們可以使用第三方 crate……
 

相關文章