隱私權政策

搜尋此網誌

技術提供:Blogger.

關於我自己

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

2023年10月27日 星期五

Rust 迭代find概述 - 找到數組中滿足條件的元素


這篇文章會稍微講述find的用法

find用於找到第一個滿足特定的值的迭代器方法

先看看文件[1]

    fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
    where
        P: FnMut(&Self::Item) -> bool,

predicate是一個閉包,會回傳一個結果的bool值

最後整個fn會返回一個Option

Option值包含兩個

如果bool值是false,也就是找不到指定條件的值,則回傳None。

若bool值是true,則回傳Some值


一個例子

假設想要找到一個數組中第一個偶數

可以使用find尋找

    let numbers: Vec<i32> = vec![1, 3, 5, 2, 4, 6, 7, 9];
    let first_even: Option<&i32> = numbers.iter().find(|&x| x % 2 == 0);
    match first_even {
        Some(even) => println!("First even number: {}", even),
        None => println!("No even numbers found."),
    }

第一行創建一個名為number的數組

第二行將numbers傳入迭代器,透過find尋找除二餘數為零的,並回傳一個Option

find只需要找元素,因此不需要變數所有權,用&x取引用值

第三行match則是判斷Option結果,如果有數值則輸出第一個偶數,None為找不到偶數。

例子

舉一個稍微難一點點的例子

假設數組裡面有學生姓名和分數

    let students = vec![("Alice", 92), ("Bob", 85), ("Charlie", 95)];

希望找出分數最高的學生

可以透過find和map配合找出最高的學生


解答

    let students = vec![("Alice", 92), ("Bob", 85), ("Charlie", 95)];
    let highest_scorer = students.iter().find(|&&(_, score)| {
        score == students.iter().map(|&(_, s)| s).max().unwrap()
    });

    match highest_scorer {
        Some(&(name, _)) => println!("Highest scorer: {}", name),
        None => println!("No students found."),
    }

第二行先將students放入迭代器

find先取出兩個閉包參數

第一個_表示取出不使用,第二個則是score

前面&&表示引用第二個參數

第三行則是find裡面的閉包內容,我們需要找到分數最高的學生

因此需要先找出分數最高是幾分,並且找出這個分數的學生

將students放入迭代器,透過map將值取出

取最大值max,並且unwrap獲取值

最後使用match將學生印出來


呈現結果:

Highest scorer: Charlie


這篇主要在講解find

find只能找出"第一個"符合條件的值

因此第二個題目其實會有問題

如果有學生同分只能找出第一個學生

需要透過其他方法解決這個問題


參考資料

0 comments:

張貼留言