Сортировка вектора
Сортировка вектора целых чисел
Этот пример сортирует вектор целых чисел с помощью метода 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]); }
Сортировка вектора вещественных чисел
Вектор из f32 or f64 может быть отсортирован с помощью методов 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]); }
Сортировка вектора структур
Пример сортирует вектор персон (то есть структур типа Person) с полями name
и age
согласно естественному порядку (по имени и возрасту). Чтобы сделать структуру Person сортируемой, нам нужно реализовать четыре типажа: Eq
,
PartialEq
, Ord
and 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), ]; // Sort people by derived natural order (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), ]); // Sort people by 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), ]); }