Rust学习(17):Rust中的集合类型之Map

文章目录

  • 初始化
  • 访问map
  • 更新map

哈希Map通过一个哈希函数来实现颜射,决定如何将键和值放入内存中。

  • 与vector类型,哈希map将它们的数据存储在堆上
  • 和vector一样,哈希map是同质的: 所有的键必须是相同类型,值也必须都是相同类型

初始化

准备

use std::collections::HashMap;

1、方法1

let mut scores = HashMap::new();

scores.insert(String::from("blue"), 10);
scores.insert(String::from("yellow"), 50);

 println!("{:?}", scores)

2、方法2

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

3、初始化与所有权:

  • 对于像 i32 这样的实现了 Copy trait 的类型,其值可以拷贝进哈希 map。对于像 String 这样拥有所有权的值,其值将被移动而哈希 map 会成为这些值的所有者
  • 如果将值的引用插入哈希 map,这些值本身将不会被移动进哈希 map。但是这些引用指向的值必须至少在哈希 map 有效时也是有效的
   let field_name = String::from("Favorite color");
   let field_value = String::from("Blue");

   let mut map = HashMap::new();
   map.insert(&field_name, field_value); //fileld_name无效

  println!("{}, {}", field_name, field_value); //error[E0382]: borrow of moved value: `field_value`

访问map

use std::collections::HashMap;

fn main() {
   let mut scores = HashMap::new();

   scores.insert(String::from("blue"), 10);
   scores.insert(String::from("yellow"), 50);

    println!("{:?}", scores);

    println!("get---->{:?}", scores.get("blue"));

    for (k, v) in & scores{
        println!("{}:{}", k, v)
    }
    
}

在这里插入图片描述
get 返回 Option,所以结果被装进 Some;如果某个键在哈希 map 中没有对应的值,get 会返回 None

更新map

1、覆盖一个值
当插入一个键时,如果已经有这个键了就直接覆盖,如果没有就创建键

use std::collections::HashMap;

fn main() {
   let mut scores = HashMap::new();

    scores.insert(String::from("Blue"), 10);
    scores.insert(String::from("Blue"), 25);

    println!("{:?}", scores);
}

2、只在键没有对应值时插入

use std::collections::HashMap;

fn main() {
   let mut scores = HashMap::new();

    scores.insert(String::from("Blue"), 10);

    scores.entry(String::from("Yellow")).or_insert(25);
    scores.entry(String::from("Blue")).or_insert(25);

    println!("{:?}", scores);
}

3、根据旧值更新值

use std::collections::HashMap;

fn main() {
    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)
}

在这里插入图片描述
参考:https://kaisery.github.io/trpl-zh-cn/ch08-03-hash-maps.html

你可能感兴趣的:(#,rust)