Rust开发:如何对结构体组成的Vector按自定义规则排序
实现方案
Rust 标准库的Vec类型内置了排序相关方法,你无需修改原结构体定义,直接通过自定义比较逻辑就能实现按指定字段排序。
按字段a的值排序
sort_by方法支持传入自定义比较闭包,直接对比两个结构体的a字段即可:
fn sort_array(generic_vector: Vec<GenericStruct>) -> Vec<GenericStruct> { let mut vec = generic_vector; // 按a字段升序排列,要降序就改为 y.a.cmp(&x.a) vec.sort_by(|item1, item2| item1.a.cmp(&item2.a)); vec }
如果不需要自定义复杂比较逻辑,也可以用更简洁的sort_by_key方法:
fn sort_array(generic_vector: Vec<GenericStruct>) -> Vec<GenericStruct> { let mut vec = generic_vector; vec.sort_by_key(|item| item.a); vec }
按字段b的字符串长度排序
逻辑和上面一致,只要把比较的key换成b字段的长度即可:
fn sort_array(generic_vector: Vec<GenericStruct>) -> Vec<GenericStruct> { let mut vec = generic_vector; // 按b的字符串长度升序,长度相同则按字符串字典序排序 vec.sort_by(|item1, item2| item1.b.len().cmp(&item2.b.len()).then(item1.b.cmp(&item2.b))); vec }
用sort_by_key的简化写法:
vec.sort_by_key(|item| (item.b.len(), item.b.as_str()));
灵活切换排序规则
如果需要在调用函数时动态指定排序规则,可以把比较逻辑作为参数传入:
fn sort_array<F>(mut generic_vector: Vec<GenericStruct>, compare: F) -> Vec<GenericStruct> where F: FnMut(&GenericStruct, &GenericStruct) -> std::cmp::Ordering, { generic_vector.sort_by(compare); generic_vector } // 调用时指定排序规则 fn main() { let some_words = String::from("Hello Word"); let x = GenericStruct { a: 25, b: some_words }; let some_vector: Vec<GenericStruct> = vec![x]; // 按a字段升序排序 let sorted_by_a = sort_array(some_vector, |a, b| a.a.cmp(&b.a)); // 按b的长度升序排序 // let sorted_by_b_len = sort_array(some_vector, |a, b| a.b.len().cmp(&b.b.len())); }
注意:Rust的排序方法都是原地排序,所以需要先把传入的不可变Vec绑定为可变变量,或者直接声明函数参数为可变的
mut generic_vector: Vec<GenericStruct>。
内容的提问来源于stack exchange,提问作者user13149230
相关产品推荐
相关产品推荐

