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

Rust HashMap详解及单词统计示例

在Rust中,HashMap是一种非常有用的数据结构,用于存储键值对。本文将深入介绍HashMap的特性,以及通过一个单词统计的例子展示其用法。

HashMap简介

HashMap是Rust标准库提供的用于存储键值对的数据结构。它允许通过键快速查找对应的值,是一个非常高效的数据结构。以下是一些关键特性:

  • 数据存储在堆上:HashMap的数据存储在堆上,使其具有动态大小,可以根据需要进行扩展或收缩。

  • 同构的:在一个HashMap中,所有的键(K)必须是同一种类型,所有的值(V)也必须是同一种类型。

创建和插入键值对

let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 60);

这段代码创建了一个HashMap实例scores,并插入了两个键值对,键为字符串类型,值为整数类型。

使用zipcollect创建HashMap

let teams = vec![String::from("Blue"), String::from("Yellow")];
let initial_scores = vec![10, 50];
let scores: HashMap<_, _> = teams.iter().zip(initial_scores.into_iter()).collect();

在这里,通过zip将两个Vec合并为一个元素为元组的迭代器,然后使用collect方法将迭代器转换为HashMap

HashMap和所有权

HashMap对于实现了Copy trait的类型,如i32,会复制值到HashMap中。对于拥有所有权的值,如String,则会移动值,所有权转移给HashMap

let field_name = String::from("Favorite color");
let field_value = String::from("Blue");let mut map = HashMap::new();
map.insert(&field_name, &field_value);

在这个例子中,我们插入了field_namefield_value的引用,而不是移动它们。在HashMap有效期内,被引用的值必须保持有效。

访问和遍历HashMap

let team_name = String::from("Blue");
let score = scores1.get(&team_name);
match score {None => println!("Team not exist"),Some(s) => println!("Score: {}", s),
}for (k, v) in &scores1 {println!("{}: {}", k, v);
}

通过get方法可以根据键获取值,返回一个Option<&V>。通过遍历HashMap,我们可以访问其中的所有键值对。

更新HashMap

let mut scores11 = HashMap::new();
scores11.insert(String::from("Blue"), 10);
scores11.insert(String::from("Blue"), 20);// 使用entry方法检查键是否存在,不存在时插入新值
scores11.entry(String::from("Yellow")).or_insert(50);
scores11.entry(String::from("Blue")).or_insert(50);

HashMap的大小是可变的,每个键同时只能对应一个值。通过entry方法可以检查键是否存在,不存在时使用or_insert方法插入新值。

单词统计示例

let text = "hello world wonderful world";let mut map = HashMap::new();
for word in text.split_whitespace() {let count = map.entry(word).or_insert(0);*count += 1;
}
println!("{:#?}", map);

这段代码展示了如何使用HashMap进行单词统计。通过遍历文本中的单词,使用entry方法检查单词是否存在,不存在时插入新值。最终,得到一个包含每个单词及其出现次数的HashMap

HashMap在Rust中是一个强大的工具,通过合理使用可以简化很多与键值对相关的问题。在实际开发中,我们可以充分利用其特性,提高代码的效率和可读性。

http://www.lryc.cn/news/300933.html

相关文章:

  • 命令执行讲解和函数
  • 外包实在是太坑了,划水三年,感觉人都废了
  • 代码随想录算法训练营第19天
  • 树莓派5 EEPROM引导加载程序恢复镜像
  • 循序渐进-讲解Markdown进阶(Mermaid绘图)-附使用案例
  • 寒假作业2月6号
  • ChatGPT绘图指南:DALL.E3玩法大全(一)
  • 计算机服务器中了_locked勒索病毒怎么办?Encrypted勒索病毒解密数据恢复
  • VueCLI核心知识3:全局事件总线、消息订阅与发布
  • Redis中缓存问题
  • 数码管扫描显示-单片机通用模板
  • IDEA中的神仙插件——Smart Input (自动切换输入法)
  • shell编程:求稀疏数组中元素的和(下标不连续)
  • Rust 学习笔记 - 详解数据类型
  • 构建本地yum源
  • 常用的正则表达式,收藏必备!!!
  • js---webAPI
  • git的常用命令有哪些?
  • 《动手学深度学习(PyTorch版)》笔记8.5
  • 【蓝桥杯单片机入门记录】LED灯(附多个例程)
  • c语言简单json库
  • Linux操作系统基础(七):Linux常见命令(二)
  • 进程状态
  • STM32固件库简介与使用指南
  • 【开源】SpringBoot框架开发智能教学资源库系统
  • 融资项目——获取树形结构的数据
  • Crypto-RSA2
  • IEEE Internet of Things Journal投稿经验
  • 实例分割论文阅读之:FCN:《Fully Convolutional Networks for Semantica Segmentation》
  • apk反编译修改教程系列---简单去除apk登陆 修改vip与一些反编译基础常识【十二】