排序 vector
排序整数 vector
此示例使用vec::sort
对整数 vector 进行排序。替代方案是使用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
,对 f32
或 f64
的 vector 进行排序。
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 结构的 Vector 进行排序,通过属性name
和age
的自然顺序(按名称和年龄)。为了使 Person 可排序,你需要四个 traitEq
,PartialEq
,Ord
和PartialOrd
。可以简单地derive
出这些特征。您还可以使用一个vec:sort_by
方法,提供自定义比较函数:只按年龄排序。
#[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), ]; // 自然顺序,排序 people (名字 和 年龄) people.sort(); assert_eq!( people, vec![ Person::new("Al".to_string(), 60), Person::new("John".to_string(), 1), Person::new("Zoe".to_string(), 25), ]); // 用 年龄 排序 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), ]); }