Rust:Rust中的集合类型之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

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值