隱私權政策

搜尋此網誌

技術提供:Blogger.

關於我自己

我的相片
目前從事軟體相關行業,喜歡閱讀、健身、喝調酒。習慣把遇到的問題記下來,每天做一些整理方便自己以後查。 Python、Rust、Kotlin等程式語言皆為自學,目前比較著重在Rust語言,歡迎一起討論。

2023年12月13日 星期三

Rust 切片chunks - 一個區塊一個區塊取出數值


這篇[1]有提到windows

windows也會一次取出很多數值

但windows會重疊視窗

而有些時候不想要重疊視窗

可以使用chunks


chunks[2]

文件這樣解釋

pub fn chunks(&self, chunk_size: usize) -> Chunks<'_, T>

切片本身並且輸入chunk的大小

輸出為Chunks,為一個迭代器

迭代器裡面每個長度皆為chunk_size

如果最後數量不足chunk_size,則最後一個chunk不會等於chunk_size


文字可能不太容易懂

用圖來說明



假設我的chunk的大小選擇為2

則他會把每兩個數值選起來

第一個為1, 2,再來為3, 4,最後為5, 6

用程式來表示就會長這樣

fn main() {
    let datas = vec![1, 2, 3, 4, 5, 6];
    for data in datas.chunks(2) {
        println!("{:?}", data);
    }
}
[1, 2] [3, 4] [5, 6]

創立一個datas為1, 2, 3, 4, 5, 6

chunk設定為兩個

可看出輸出與預想中一樣


假設data數量有七個



一樣把兩個數據兩個數據框起來

但最後一組數字不足兩個,只會顯示7

程式表示會這樣

fn main() {
    let datas = vec![1, 2, 3, 4, 5, 6, 7];
    for data in datas.chunks(2) {
        println!("{:?}", data);
    }
}
[1, 2]
[3, 4]
[5, 6]
[7]

一樣兩個兩個一組

最後一個7不足兩個,會自己一組


例子

假設我有一串二進制的數字

希望將每四個每四個轉成10進制整數

例如 1010 0001 1100 1111

我要轉成 10 1 12 15

可以透過chunks和map[3]配合

fn main() {
    let data = vec![1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1];
    let res: Vec<_> = data
        .chunks(4)
        .map(|num| {
            num[0] * 2_i32.pow(3)
                + num[1] * 2_i32.pow(2)
                + num[2] * 2_i32.pow(1)
                + num[3] * 2_i32.pow(0)
        })
        .collect();
    println!("{:?}", res);
}
[10, 1, 12, 15]

透過chunks先對每四個數字取樣

使用map處理這四個數字

蒐集到的數據是倒過來的

因此第一個數字要乘上2的3次方

第二個數字乘上2的平方

以此類推

最後蒐集起來輸出

跟預期一樣出現 10 1 12 15


參考資料

[1] https://lageeblog.blogspot.com/2023/11/rust-windows.html

[2] https://doc.rust-lang.org/std/primitive.slice.html#method.chunks

[3] https://lageeblog.blogspot.com/2023/10/rust-map.html

0 comments:

張貼留言