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]

使用 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 方法并提供一个比较函数来实现降序排序,如最后一行代码所示。

相关推荐

  1. Rust Vec 排序方法汇总

    2024-03-24 16:24:01       23 阅读
  2. RustVec<T>

    2024-03-24 16:24:01       33 阅读
  3. Rust 语言中 Vec 元素删除方法

    2024-03-24 16:24:01       21 阅读
  4. Rust Vec<u8> 类型

    2024-03-24 16:24:01       17 阅读
  5. Rust-vec!与Vec::with_capacity初始化数组区别

    2024-03-24 16:24:01       44 阅读
  6. 常规排序算法汇总

    2024-03-24 16:24:01       11 阅读

最近更新

  1. Leetcode101 判断二叉树是否对称

    2024-03-24 16:24:01       0 阅读
  2. 【深入剖析】Kylin架构全景及其组件详解

    2024-03-24 16:24:01       0 阅读
  3. poi导出值班excel

    2024-03-24 16:24:01       1 阅读
  4. MP公共字段填充

    2024-03-24 16:24:01       1 阅读

热门阅读

  1. Spring Boot的静态资源自动配置原理

    2024-03-24 16:24:01       23 阅读
  2. es 集群开机自动启动

    2024-03-24 16:24:01       16 阅读
  3. Rust 双向链表 LinkedList 和安全删除元素的方法

    2024-03-24 16:24:01       21 阅读
  4. cloud微服务

    2024-03-24 16:24:01       21 阅读
  5. 5.79 BCC工具之tcpaccept.py解读

    2024-03-24 16:24:01       22 阅读
  6. 外部提供控制程序

    2024-03-24 16:24:01       19 阅读
  7. Python基础语法(二)

    2024-03-24 16:24:01       21 阅读
  8. 大厂面试--列举并解释一下 http的所有请求方法?

    2024-03-24 16:24:01       18 阅读