当前位置:   article > 正文

学习 Rust 的第十四天:如何使用HashMap

学习 Rust 的第十四天:如何使用HashMap

大家好,

今天我们来看一下哈希图,由于意外情况,我昨天没能上传,所以现在补上。让我们直奔主题。

简介

哈希图存储键值对,并使用哈希函数来确定放置键/值的位置。

哈希图是 std::collections 模块的一部分。

创建

就像向量或字符串一样,我们可以使用 new() 方法创建哈希图。

use std::collections::HashMap;  
  
fn main() {  
  let mut my_map = HashMap::new();  
}
  • 1
  • 2
  • 3
  • 4
  • 5

插入

我们可以使用 insert 方法将键值对插入哈希图中。

use std::collections::HashMap;  
  
fn main() {  
  let mut my_map = HashMap::new();  
  my_map.insert("key", "value");  
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

访问

我们可以使用 get 方法访问哈希图中的值,该方法返回一个 Option<&V>

use std::collections::HashMap;  
  
fn main() {  
  let mut my_map = HashMap::new();  
  my_map.insert("key", "value");  
  
  if let Some(value) = my_map.get("key") {  
      println!("值:{}", value);  
  } else {  
      println!("未找到键");  
  }  
  
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

更新

我们可以使用 insert 方法更新与键关联的值,如果键已经存在,则会替换现有的值:

use std::collections::HashMap;  
  
fn main() {  
  let mut my_map = HashMap::new();  
  my_map.insert("key", "value");  
  
  if let Some(value) = my_map.get("key") {  
      println!("值:{}", value);  
  } else {  
      println!("未找到键");  
  }  
  
  my_map.insert("key", "new_value");  
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

如果我们不想覆盖现有的值,可以这样做:

my_map.entry("key").or_insert("another_key_value_pair");
  • 1

如果 key 存在,这行代码不会对哈希图进行任何更改,但如果不存在,它将创建一个键值对,形式如下:

{"key":"another_key_value_pair"}
  • 1

方法 entry 给了我们一个表示括号中提供的值的 entry 枚举。然后我们调用 or_insert 方法,如果这已经存在,则插入一个键值对。

迭代

我们可以使用 for 循环或迭代器遍历哈希图中的键值对。

use std::collections::HashMap;  
  
fn main() {  
  let mut my_map = HashMap::new();  
  my_map.insert("key", "value");  
  
  if let Some(value) = my_map.get("key") {  
      println!("值:{}", value);  
  } else {  
      println!("未找到键");  
  }  
  my_map.insert("key", "new_value");  
  
  for (key, value) in &my_map {  
    println!("键:{}, 值:{}", key, value);  
  }  
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

大小

我们可以使用 len 方法获取哈希图中键值对的数量:

println!("大小:{}", my_map.len());
  • 1

例子


use std::collections::HashMap;  
  
fn main() {  
    let text = "hello world hello rust world";  
  
    // 创建一个空的哈希图来存储单词计数  
    let mut word_count = HashMap::new();  
  
    // 遍历文本中的每个单词  
    for word in text.split_whitespace() {  
        // 计算每个单词的出现次数  
        let count = word_count.entry(word).or_insert(0);  
        *count += 1;  
    }  
  
    // 打印单词计数  
    for (word, count) in &word_count {  
        println!("{}: {}", word, count);  
    }  
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 我们从 std::collections 模块导入 HashMap 来在程序中使用哈希图。

在 main 函数中:

  • 我们定义一个包含输入文本的字符串 text
  • 我们创建一个名为 word_count 的空哈希图来存储每个单词的计数。
  • 我们使用 split_whitespace() 迭代输入文本中的每个单词,该方法根据空白字符拆分文本。

对于每个单词:

  • 我们使用 HashMap 的 entry 方法获取单词的 Entry。该方法返回一个表示哈希图条目的 entry 枚举。
  • 我们在 Entry 上使用 or_insert 方法来插入一个新条目,如果哈希图中不存在该单词,则将值设为 0。否则,它返回对现有值的可变引用。
  • 然后,我们通过解引用可变引用并使用 += 1 操作符来增加单词的计数。
  • 计算完所有单词后,我们使用 for 循环遍历 word_count 哈希图。对于每个键值对,我们打印单词及其计数。

该程序将输出:

hello: 2  
world: 2  
rust: 1
  • 1
  • 2
  • 3

结论

总之,在 Rust 中,哈希图位于 std::collections 模块中,是一种高效的数据结构,用于存储键值对。本文介绍了创建、插入、访问、更新和迭代哈希图等基本操作。通过一个实际的单词计数示例,我们展示了它们在实际应用场景中的用途。哈希图提供了一种灵活而强大的方式来组织和访问数据,在 Rust 编程中是不可或缺的工具。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/514556
推荐阅读
相关标签
  

闽ICP备14008679号