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:
張貼留言