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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/768925.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器人|逆运动学问题解决方法总结

如是我闻: 解决逆运动学(Inverse Kinematics, IK)问题的方法多样,各有特点。以下是一个综合概述: 1. 解析法(Analytical Solutions) 特点:直接使用数学公式计算关节角度&#xff0…

0基础 三个月掌握C语言(14)-上

自定义类型 其实C语言有内置类型 也有自定义的类型 内置类型(C语言本身支持的现成的类型) 如:char short int long float double.... 但仅仅有这些类型是不够的 比如说 我们想表示一个人(复杂对象) 对于人的描述那…

我们是如何测试人工智能的(八)包含大模型的企业级智能客服系统拆解与测试方法 -- 大模型 RAG

大模型的缺陷 -- 幻觉 接触过 GPT 这样的大模型产品的同学应该都知道大模型的强大之处, 很多人都应该调戏过 GPT,跟 GPT 聊很多的天。 作为一个面向大众的对话机器人,GPT 明显是鹤立鸡群,在世界范围内还没有看到有能跟 GPT 扳手腕…

探索AI大模型学习:理论基础、技术突破与未来挑战

在当今技术飞速发展的时代,人工智能(AI)大模型学习无疑是推动科技进步和创新的关键力量。AI大模型学习的核心在于通过训练大规模的数据集来提升模型的性能,使之能够更准确、更高效地完成各种任务,从而在多个领域中实现…

开启Safari手势支持

在使用Safari 的时候,大家有没有觉得不支持手势使用起来不是很方便, 触摸板只支持少量简单的手势,如缩放,滚动等。如果使用鼠标的用户,则完全无法使用手势。经过折腾研究,使用CirMenu应用可以完美解决这个要…

C++第十一弹---类与对象(八)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1、友元 1.1、友元函数 1.2、友元类 2、内部类 3、匿名对象 4、拷贝对象时的一些编译器优化 总结 1、友元 友元提供了一种突破封装的方式&a…

深度解析:Elasticsearch写入请求处理流程

版本 Elasticsearch 8.x 原文链接:https://mp.weixin.qq.com/s/hZ_ZOLFUoRuWyqp47hqCgQ 今天来看下 Elasticsearch 中的写入流程。 不想看过程可以直接跳转文章末尾查看总结部分。最后附上个人理解的一个图。 从我们发出写入请求,到 Elasticsearch 接收请…

QT 常用模块介绍以及使用说明

当学习 QT 编程时&#xff0c;掌握以下几个关键模块是非常重要的。下面是每个模块的简要说明及示例程序&#xff1a; Qt Widgets 模块&#xff1a; 说明&#xff1a;Qt Widgets 模块包含用于创建传统桌面应用程序的 UI 控件。示例程序&#xff1a;#include <QApplication>…

单目深度估计基础理论和论文学习总结

单目深度估计基础理论和论文学习总结 一、背景知识&#xff1a; 三维刚体运动的数学表示&#xff1a;旋转平移矩阵、旋转向量、欧拉角、四元数、轴角模型、齐次坐标、各种变换等 照相机模型&#xff1a;单目/双目模型&#xff0c;单目中的世界坐标系/相机坐标系/图像坐标系的…

从零开始的 dbt 入门教程 (dbt cloud 自动化篇)

一、引 在前面的几篇文章中&#xff0c;我们从 dbt core 聊到了 dbt 项目工程化&#xff0c;我相信前几篇文章足够各位数据开发师从零快速入门 dbt 开发&#xff0c;那么到现在我们更迫切需要解决的是如何让数据更新做到定时化&#xff0c;毕竟作为开发我们肯定没有经历每天定…

【项目管理后台】Vue3+Ts+Sass实战框架搭建二

Vue3TsSass搭建 git cz的配置mock 数据配置viteMockServe 建立mock/user.ts文件夹测试一下mock是否配置成功 axios二次封装解决env报错问题&#xff0c;ImportMeta”上不存在属性“env” 统一管理相关接口新建api/index.js 路由的配置建立router/index.ts将路由进行集中封装&am…

GA遗传算法和ALNS算法的区别(我的APS项目七)

博主用最简单的方式告诉你遗传算法是什么&#xff0c;估计这是网上最简单的遗传算法入门教程了。首先我们先带入一个问题&#xff0c;我们要去9大城市旅游&#xff0c;想知道每个城市走一遍&#xff0c;总路程最短的出行顺序是什么&#xff1f; OK&#xff0c;题目我们已经明确…

Chrome 插件打包发布

插件打包发布 一、打包成 zip 包 最简单方便的一种其实就是打包成 zip 包&#xff0c;通过下载链接进行下载&#xff0c;在包里面通过设置版本号和数据库的版本号对比来提醒用户进行新包的下载。 二、发布到 Chrome 应用商店 1. 注册成为开发者 在发布到 chrome 应用商店之…

git 提交空目录

git 提交空目录 1. git 无法感应空目录2. git 提交空目录References 1. git 无法感应空目录 Git FAQ https://archive.kernel.org/oldwiki/git.wiki.kernel.org/index.php/GitFaq.html Currently the design of the Git index (staging area) only permits files to be liste…

第八节:深入讲解SMB中的Http组件

一、概述 Http组作是SMB中的核心组件之一&#xff0c;在第七节中讲解了如何简洁的进行web程序部署和运行&#xff0c;这只是它的功能之一。在本节中&#xff0c;我们将介绍Http组件的重要属性。 二、请求头Request 1、支持方法 支持POST、GET、PUT、DELETE、OPTIONS等方法&a…

吴恩达深度学习笔记:神经网络的编程基础2.15-2.17

目录 第一门课&#xff1a;神经网络和深度学习 (Neural Networks and Deep Learning)第二周&#xff1a;神经网络的编程基础 (Basics of Neural Network programming)2.15 Python 中的广播&#xff08;Broadcasting in Python&#xff09;2.16 关于 python _ numpy 向量的说明&…

作为技术人员在日常工作中如何使用边界AICHAT工具

目录 1.1、解决日常问题1.2、编写日常程序1.3、优化日常工作中的代码1.4、边界AICHAT工具会员中心1.5、边界AICHAT工具普通用户的权益1.6、边界AICHAT工具超级永久会员的权益 有关边界AICHAT工具工具的介绍请参考之前的系列博文&#xff0c; 一款好用的AI工具——边界AICHAT&a…

【SpringSecurity】十六、OAuth2.0授权服务器、资源服务器的配置(理论部分)

文章目录 0、OAuth2服务端结构1、授权服务配置2、授权服务器 ⇒ 配置客户端详情3、授权服务器 ⇒ 管理令牌配置4、授权服务器&#xff1a;配置端点访问的安全约束5、资源服务器配置 相关&#x1f4d5;&#xff1a; 【OAuth2授权服务器配置完整Demo】 0、OAuth2服务端结构 OAu…

微服务(基础篇-003-Nacos集群搭建)

目录 Nacos集群搭建 1.集群结构图 2.搭建集群 2.1.初始化数据库 2.2.下载nacos 2.3.配置Nacos 2.4.启动 2.5.nginx反向代理 2.6.优化 视频地址&#xff1a; 06-Nacos配置管理-nacos集群搭建_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1LQ4y127n4?p29&…

【Linux文本处理三剑客-grep、awk、sed】

grep, awk, 和 sed 是三个强大的文本处理工具&#xff0c;在Linux系统中广泛使用。每个工具都有其独特的特性和用法&#xff0c;下面我会对每一个工具进行简要的介绍和说明。 1.grep grep 是一个用于模式搜索的工具&#xff0c;它可以在文件或者标准输入中搜索包含特定模式的…