Vector 排序
对整数 Vector 排序
以下示例使用 Vec::sort 来排序,如果大家希望获得更高的性能,可以使用 Vec::sort_unstable,但是该方法无法保留相等元素的顺序。
fn main() { let mut vec = vec![1, 5, 10, 2, 15]; vec.sort(); assert_eq!(vec, vec![1, 2, 5, 10, 15]); }
对浮点数 Vector 排序
浮点数数组可以使用 Vec::sort_by 和 PartialOrd::partial_cmp 进行排序。
fn main() { let mut vec = vec![1.1, 1.15, 5.5, 1.123, 2.0]; vec.sort_by(|a, b| a.partial_cmp(b).unwrap()); assert_eq!(vec, vec![1.1, 1.123, 1.15, 2.0, 5.5]); }
对结构体 Vector 排序
以下示例中的结构体 Person
将实现基于字段 name
和 age
的自然排序。为了让 Person
变为可排序的,我们需要为其派生 Eq、PartialEq、Ord、PartialOrd
特征,关于这几个特征的详情,请见这里。
当然,还可以使用 vec:sort_by 方法配合一个自定义比较函数,只按照 age
的维度对 Person
数组排序。
#[derive(Debug, Eq, Ord, PartialEq, PartialOrd)] struct Person { name: String, age: u32 } impl Person { pub fn new(name: String, age: u32) -> Self { Person { name, age } } } fn main() { let mut people = vec![ Person::new("Zoe".to_string(), 25), Person::new("Al".to_string(), 60), Person::new("John".to_string(), 1), ]; // 通过派生后的自然顺序(Name and age)排序 people.sort(); assert_eq!( people, vec![ Person::new("Al".to_string(), 60), Person::new("John".to_string(), 1), Person::new("Zoe".to_string(), 25), ]); // 只通过 age 排序 people.sort_by(|a, b| b.age.cmp(&a.age)); assert_eq!( people, vec![ Person::new("Al".to_string(), 60), Person::new("Zoe".to_string(), 25), Person::new("John".to_string(), 1), ]); }