排序
简单排序
-
整数排序
#[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]}