当前位置: 首页 > news >正文

Rust 语言的 HashMap

HashMap 在 Rust 中是一个非常常用且强大的数据结构,它允许你存储键值对(key-value pairs),并且能够快速地基于键检索值。

下面是使用 HashMap 的一些基本示例:

首先,你需要在你的文件中引入 HashMap

use std::collections::HashMap;

创建一个新的 HashMap

let mut map = HashMap::new();

插入元素

使用 insert 方法插入元素:

map.insert(String::from("key1"), 1);
map.insert(String::from("key2"), 2);
map.insert(String::from("key3"), 3);

注意,在上述例子中,键是 String 类型,值是 i32 类型。在实际使用中,你可以使用任何实现了适当 trait(例如 EqHash 对于键)的类型。

检索元素

使用 get 方法检索元素:

let value = map.get(&String::from("key1"));
match value {Some(v) => println!("Found value: {}", v),None => println!("No value found"),
}

或者更简洁地,使用 if let 语法:

if let Some(v) = map.get(&String::from("key1")) {println!("Found value: {}", v);
} else {println!("No value found");
}

遍历 HashMap

你可以使用 for 循环遍历 HashMap 中的键值对:

for (key, value) in &map {println!("{}: {}", key, value);
}

更新 HashMap 中的值

如果键已经存在,insert 方法会覆盖旧的值。如果你只想在键不存在时插入新值,可以使用 entry 方法:

match map.entry(String::from("key1")) {std::collections::hash_map::Entry::Occupied(mut entry) => {// 修改现有值*entry.get_mut() = 4;},std::collections::hash_map::Entry::Vacant(entry) => {// 插入新值entry.insert(1);},
}

或者使用更简洁的 or_insert 方法:

*map.entry(String::from("key1")).or_insert(1) = 4; // 如果 "key1" 存在,将其值设置为 4;否则,插入 (key1, 1) 但随后立即将其值更改为 4(这可能不是你想要的,因此请谨慎使用此简洁形式)。

通常你可能想要这样做:

if !map.contains_key(&String::from("key1")) {map.insert(String::from("key1"), 1);
} else {// 如果需要的话,处理已经存在键的情况。
}

或者,更优雅地使用 entry 方法:

map.entry(String::from("key1")).or_insert_with(|| {// 仅在键不存在时计算并插入新值。这里的闭包返回要插入的值。1 // 例如,这里返回1作为新值。实际上,你可以执行任何复杂的计算或逻辑来生成这个值。
});

在这个例子中,or_insert_with 方法允许你指定一个闭包,该闭包在键不存在时被调用以生成要插入的值。这对于需要复杂计算或避免不必要计算的情况非常有用。如果键已经存在,则不会调用闭包。

相关文章:

  • 代码随想录算法训练营DAY7| C++哈希表Part.2|LeetCode:454.四数相加II、383.赎金信、15. 三数之和、18.四数之和
  • XSS学习(cookie远程登录演示)
  • AXI4-Stream Interconnect IP核(1)——原理
  • MySQL数据库 - 复杂查询(一)
  • 二叉树|701.二叉搜索树中的插入操作
  • Springboot项目之mybatis-plus多容器分布式部署id重复问题之源码解析
  • 【生成对抗网络GAN】一篇文章讲透~
  • 《无名之辈》天涯镖局攻略:高效拉镖窍门!
  • Codeup_1132:问题 A: 最长公共子序列
  • 大话设计模式之模板方法模式
  • 云原生最佳实践系列 4:基于 MSE 和 SAE 的微服务部署与压测
  • 你的 Python 代码需要解释一下了!
  • ideaSSM 人才引进管理系统bootstrap开发mysql数据库web结构java编程计算机网页源码maven项目
  • 医院同步时钟系统的耐用性与可靠性
  • 【数据分享】1929-2023年全球站点的逐日平均海平面压力(Shp\Excel\免费获取)
  • [译]如何构建服务器端web组件,为何要构建?
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • Docker 笔记(2):Dockerfile
  • JAVA_NIO系列——Channel和Buffer详解
  • Java基本数据类型之Number
  • Linux中的硬链接与软链接
  • mysql常用命令汇总
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • Python进阶细节
  • react 代码优化(一) ——事件处理
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • vue 个人积累(使用工具,组件)
  • 从输入URL到页面加载发生了什么
  • 番外篇1:在Windows环境下安装JDK
  • 基于axios的vue插件,让http请求更简单
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • ​比特币大跌的 2 个原因
  • #define 用法
  • #pragma预处理命令
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (新)网络工程师考点串讲与真题详解
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (一)为什么要选择C++
  • (转)四层和七层负载均衡的区别
  • ... 是什么 ?... 有什么用处?
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET Core Web APi类库如何内嵌运行?
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .Net 中Partitioner static与dynamic的性能对比
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .pop ----remove 删除
  • /dev/sda2 is mounted; will not make a filesystem here!