use std::collections::HashMap;
#[derive(Debug)]
struct Student {
name: String,
grades: Vec<i32>,
}
fn main() {
let students: Vec<Student> = vec![
Student {
name: "Alice".to_string(),
grades: vec![85, 90, 78],
},
Student {
name: "Bob".to_string(),
grades: vec![55, 48, 60],
},
Student {
name: "Charlie".to_string(),
grades: vec![70, 65, 72],
},
];
let result: HashMap<String, f64> = students
.into_iter()
.filter_map(|student| {
let total: i32 = student.grades.iter().sum();
let average = total as f64 / student.grades.len() as f64;
if average >= 60.0 {
Some((student.name, average))
} else {
None
}
})
.collect();
println!("{:?}", result);
}
优化措施及原因:
- 使用
into_iter
:into_iter
会消耗集合,避免了数据的拷贝,直接将所有权转移到迭代器中,从而提升性能。
- 在
filter_map
中直接处理数据:避免了中间变量的创建和额外的内存分配。在filter_map
闭包中,计算平均成绩并判断是否大于等于60分,直接生成Some
或None
,减少了不必要的内存操作。
- 使用
sum
方法:sum
方法可以高效地对Vec<i32>
中的所有元素求和,避免了手动遍历和累加,提高了代码的简洁性和性能。