面试题答案
一键面试实现思路
- 过滤元素:使用
filter
方法对Vec<MyType>
进行过滤,通过闭包来指定根据哪个字段进行过滤。由于filter
返回的是一个Filter
迭代器,不会立即分配新的内存,而是按需生成元素,避免了不必要的内存分配。 - 排序:在过滤后的迭代器上使用
collect
方法将其转换回Vec
,然后调用sort_by_key
方法,通过闭包指定根据另一个字段进行排序。sort_by_key
会直接在原向量上进行排序,避免额外的内存分配。 - 映射操作:排序后,对这个
Vec
使用iter
方法获取一个迭代器,然后调用map
方法进行映射操作,生成新的结果集。map
返回的是一个Map
迭代器,不会立即分配新内存,最后使用collect
方法将其收集成最终的结果集。
关键代码片段
// 定义自定义类型
struct MyType {
field1: i32,
field2: String,
// 其他字段...
}
fn main() {
let mut my_vec: Vec<MyType> = vec![
MyType { field1: 3, field2: "c".to_string() },
MyType { field1: 1, field2: "a".to_string() },
MyType { field1: 2, field2: "b".to_string() },
];
// 过滤元素
let filtered = my_vec.iter().filter(|item| item.field1 > 1);
// 排序
let mut sorted: Vec<&MyType> = filtered.collect();
sorted.sort_by_key(|item| &item.field2);
// 映射操作
let result: Vec<String> = sorted.iter().map(|item| item.field2.clone()).collect();
println!("{:?}", result);
}
在上述代码中:
- 首先定义了
MyType
结构体。 - 然后创建了一个
Vec<MyType>
。 - 使用
filter
根据field1
过滤元素。 collect
成Vec<&MyType>
后用sort_by_key
根据field2
排序。- 最后通过
map
和collect
得到新的Vec<String>
结果集。这样的实现方式尽量避免了不必要的内存分配和复制。