【Rust基础】排序和分组
排序
简单排序
-
整数排序
#[test] fn test_sort(){ let mut list = vec![1, 5, 3, 2, 4]; list.sort(); //✔ assert_eq!(list, vec![1, 2, 3, 4, 5]); }
-
小数排序
#[test] fn test_sort(){ let mut list = vec![1, 5, 3, 2, 4]; //❌ 不能直接使用sort,因为f32和f64未实现Ord trait //list.sort(); //✔ 可以使用sort_by,自定义排序规则 list.sort_by(|a, b| a.partial_cmp(b).unwrap()); assert_eq!(list, vec![1., 2., 3., 4., 5.]); }
💡
partial_cmp
和total_cmp
:total_cmp
接受NAN
的比较,partial_cmp
如未处理NAN
会paninc; -
struct排序
#[test] fn test_struct_sort() { #[derive(Debug)] struct Person { name: String, age: i32, } let mut persons = vec![ Person { name: "Alice".to_string(), age: 25, }, Person { name: "Bob".to_string(), age: 30, }, Person { name: "Charlie".to_string(), age: 20, }, ]; persons.sort_by(|a, b| a.age.cmp(&b.age)); println!("sorted_persons: {:?}", persons); // sorted_persons: [Person { name: "Charlie", age: 20 }, Person { name: "Alice", age: 25 }, Person { name: "Bob", age: 30 }] }
分组
使用HashMap
#[test]
fn test_group() {
// 按奇数和偶数分组
let list = vec![1, 2, 3, 4, 5];
let mut group = HashMap::new();
list.iter().for_each(|x| {
if x % 2 == 0 {
group.entry("even").or_insert(vec![]).push(*x);
} else {
group.entry("odd").or_insert(vec![]).push(*x);
}
});
println!("group:{:?}", group);
// group:{"odd": [1, 3, 5], "even": [2, 4]}
}
使用itertools
#[test]
fn test_group_with_iter_tools() {
// 按奇数和偶数分组
let list = vec![1, 2, 3, 4, 5];
let group = list
.iter()
.into_group_map_by(|&x| if x % 2 == 0 { "even" } else { "odd" });
println!("group:{:?}", group);
}
//group:{"odd": [1, 3, 5], "even": [2, 4]}