在 Rust 中,Vec
类型的排序可以通过使用 sort
方法来实现。sort
方法是 Vec
的一个成员方法,它会对向量中的元素进行就地排序(即不返回新的排序后的向量,而是直接修改原始向量)。此外,sort_by
和 sort_by_key
方法允许你提供自定义的排序逻辑。
以下是一些示例:
使用 sort
方法对整数向量进行排序
let mut numbers = vec![4, 2, 9, 1, 5, 8, 3, 7, 6];
numbers.sort();
println!("{:?}", numbers); // 输出: [1, 2, 3, 4, 5, 6, 7, 8, 9]
使用 sort_by
方法对字符串向量进行自定义排序
let mut words = vec!["banana", "apple", "cherry", "date"];
words.sort_by(|a, b| a.cmp(b)); // 默认就是按字典序排序
println!("{:?}", words); // 输出: ["apple", "banana", "cherry", "date"]
// 自定义排序逻辑,例如按字符串长度排序
words.sort_by(|a, b| a.len().cmp(&b.len()));
println!("{:?}", words); // 输出: ["date", "apple", "banana", "cherry"]
使用 sort_by_key
方法对结构体向量进行排序
假设你有一个结构体 Person
,并且你想根据 age
字段对其进行排序:
#[derive(Debug)]
struct Person {
name: String,
age: u32,
}
let mut people = vec![
Person { name: "Alice".to_string(), age: 30 },
Person { name: "Bob".to_string(), age: 20 },
Person { name: "Charlie".to_string(), age: 25 },
];
// 按年龄升序排序
people.sort_by_key(|person| person.age);
println!("{:?}", people);
// 输出: [Person { name: "Bob", age: 20 }, Person { name: "Charlie", age: 25 }, Person { name: "Alice", age: 30 }]
// 按年龄降序排序
people.sort_by_key(|person| -(person.age as i32)); // 注意这里使用了负号来实现降序
println!("{:?}", people);
// 输出: [Person { name: "Alice", age: 30 }, Person { name: "Charlie", age: 25 }, Person { name: "Bob", age: 20 }]
注意,在上面的降序排序示例中,我们通过将年龄转换为负数来实现降序排序。这是因为 sort_by_key
需要实现 Ord
trait 的类型,而 u32
是无符号整数,不支持负数。因此,我们通过将其转换为 i32
并取负值来“模拟”降序排序。然而,这种做法并不是最佳实践,因为它可能会导致整数溢出。更好的做法是使用 rev
方法与 sort_by_key
结合使用,如下所示:
people.sort_by_key(|person| person.age).rev();
// 注意:上面的代码实际上不会改变 `people` 的排序,因为 `rev()` 返回的是一个新的迭代器。
// 正确的方式是使用 `sort_by` 并提供自定义的比较逻辑来实现降序排序:
people.sort_by(|a, b| b.age.cmp(&a.age));
println!("{:?}", people); // 输出按年龄降序排列的人员列表
但是,请注意,rev()
方法实际上不会改变向量本身的排序;它只会返回一个反向的迭代器。因此,在上面的代码中,我们应该使用 sort_by
方法并提供一个比较函数来实现降序排序,如最后一行代码所示。