隱私權政策

搜尋此網誌

技術提供:Blogger.

關於我自己

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

2023年11月25日 星期六

Rust 切片windows - 一次對數組中多個元素處理


如果想要一次對數組中多個元素處理

例如兩個、三個等等

非常適合用windows

windows就是常聽到的滑動窗口

不只在題目很常看到

在平常Coding也是很好用的方法


windows

文件[1]這樣提到

傳回長度為size的窗口迭代器,並且窗口重疊

...

可能不是很好懂

直接看定義

pub fn windows(&self, size: usize) -> Windows<'_, T>

self為切片本身,可以是字串切片也可以是數組切片

size則是窗口內的要幾個數值

最後回傳一個Windows迭代器

而窗口會重疊

如果傳入大於切片大小的size,不回傳數值

如果size為0,則發生panic


例子

只看文字是不是很難理解

那舉個例子

如果有個數組為[1, 2, 3, 4, 5]

size為2

也就是會輸出[1, 2][2, 3][3, 4][4, 5]

用圖解釋比較好解釋

圖1. 窗口移動講解

以程式碼來說

    let data = vec![1, 2, 3, 4, 5];
    let res = data.windows(2).collect::<Vec<_>>();
    println!("{:?}", res);
[[1, 2], [2, 3], [3, 4], [4, 5]]

第一行創建數組

第二行使用windows創立迭代器,視窗大小設定為2,然後放入數組中

可看出輸出結果與預想一樣


再舉一個

假設size為3

圖2. 窗口大小為3

可看出一開始為[1, 2, 3],第二次會出現[2, 3, 4],第三次為[3, 4, 5]

以程式碼就是這樣

    let data = vec![1, 2, 3, 4, 5];
    let res = data.windows(3).collect::<Vec<_>>();
    println!("{:?}", res);
[[1, 2, 3], [2, 3, 4], [3, 4, 5]]


而如果size大於data的數量會發生什麼事?

    let data = vec![1, 2, 3, 4, 5];
    let res = data.windows(6).collect::<Vec<_>>();
    println!("{:?}", res); []

會直接輸出空數組


另一個是size為0會發生什麼事?

    let data = vec![1, 2, 3, 4, 5];
    let res = data.windows(0).collect::<Vec<_>>();
    println!("{:?}", res);
thread 'main' panicked at 'window size must be non-zero', src\main.rs:11:20

這次會直接panic,明確顯示window size不能為0


應用

舉一個簡單的應用

原本記得在LeetCode上面有做到蠻有趣的題目

但突然找不到

用一個windows搭配map[2]先頂著

假設一樣剛剛的數組

希望獲得每兩個數值的平方相加

可以這麼做

    let data = vec![1, 2, 3, 4, 5];
    let res = data
        .windows(2)
        .map(|x| x[0] * x[0] + x[1] * x[1])
        .collect::<Vec<_>>();
    println!("{:?}", res);
[5, 13, 25, 41]

windows會取出兩個數值

透過map以及閉包配合

可以獲得每兩個數值平方相加結果


參考資料

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

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

0 comments:

張貼留言