当前位置:   article > 正文

Rust 的 Vec 排序方法汇总

Rust 的 Vec 排序方法汇总

Rust 中,Vec 类型的排序可以通过使用 sort 方法来实现。sort 方法是 Vec 的一个成员方法,它会对向量中的元素进行就地排序(即不返回新的排序后的向量,而是直接修改原始向量)。此外,sort_bysort_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]
  • 1
  • 2
  • 3

使用 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"]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

使用 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 }]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

注意,在上面的降序排序示例中,我们通过将年龄转换为负数来实现降序排序。这是因为 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); // 输出按年龄降序排列的人员列表
  • 1
  • 2
  • 3
  • 4
  • 5

但是,请注意,rev() 方法实际上不会改变向量本身的排序;它只会返回一个反向的迭代器。因此,在上面的代码中,我们应该使用 sort_by 方法并提供一个比较函数来实现降序排序,如最后一行代码所示。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/328027
推荐阅读
  

闽ICP备14008679号