Rust 的 Vec 排序方法汇总

在 Rust 中,Vec 类型的排序可以通过使用 sort 方法来实现。sort 方法是 Vec 的一个成员方法,它会对向量中的元素进行就地排序(即不返回新的排序后的向量,而是直接修改原始向量)。此外,sort_bysort_by_key 方法允许你提供自定义的排序逻辑。

以下是一些示例:

使用 sort 方法对整数向量进行排序

rust 复制代码
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 方法对字符串向量进行自定义排序

rust 复制代码
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 字段对其进行排序:

rust 复制代码
#[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 结合使用,如下所示:

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

相关推荐
励志要当大牛的小白菜39 分钟前
ART配对软件使用
开发语言·c++·qt·算法
qq_5139704442 分钟前
力扣 hot100 Day56
算法·leetcode
PAK向日葵2 小时前
【算法导论】如何攻克一道Hard难度的LeetCode题?以「寻找两个正序数组的中位数」为例
c++·算法·面试
爱装代码的小瓶子3 小时前
数据结构之队列(C语言)
c语言·开发语言·数据结构
爱喝矿泉水的猛男4 小时前
非定长滑动窗口(持续更新)
算法·leetcode·职场和发展
YuTaoShao4 小时前
【LeetCode 热题 100】131. 分割回文串——回溯
java·算法·leetcode·深度优先
Maybe_ch4 小时前
.NET-键控服务依赖注入
开发语言·c#·.net
超浪的晨4 小时前
Java UDP 通信详解:从基础到实战,彻底掌握无连接网络编程
java·开发语言·后端·学习·个人开发
终焉暴龙王4 小时前
CTFHub web进阶 php Bypass disable_function通关攻略
开发语言·安全·web安全·php
YouQian7724 小时前
Traffic Lights set的使用
算法