rust HashMap

一,简介

     HashMap 是最不常用的,所以并没有被 prelude 自动引用。标准库中对 HashMap 的支持也相对较少,例如,并没有内建的构建宏所有的键必须是相同类型,值也必须都是相同类型。
     key ,value不允许有 None  。

二,常见操作

         3中声明方式,HashMap的所有权,循环HashMap,增删改查

use std::collections::HashMap;

fn main() {
    //1,new 创建一个空的 HashMap
    let mut map = HashMap::new(); //默认长度是0
    map.insert("blue", 10);
    let yellow = "yellow";
    let mut num = 50;
    map.insert(yellow, num);
    println!(
        " map : {:?} ,len : {} ,capacity : {}",
        map,
        map.len(),
        map.capacity()
    );

    //2,声明一个有初始长度的HashMap
    let mut map2: HashMap<i32, i32> = HashMap::with_capacity(10);
    map2.insert(num, num);
    println!(
        " map2 : {:?} ,len : {} ,capacity : {}",
        map2,
        map2.len(),
        map2.capacity()
    );

    //3,用队伍列表和分数列表创建哈希 map
    let keys = vec![String::from("blue"), String::from("yellow")];
    let values = vec![10, 50];
    let map3: HashMap<_, _> = keys.iter().zip(values.iter()).collect();
    println!(
        " map3 : {:?} ,len : {} ,capacity : {}",
        map3,
        map3.len(),
        map3.capacity()
    );

    //HashMap的所有权
    //对于像 i32 这样的实现了 Copy trait 的类型,其值可以拷贝进哈希 map。
    // 对于像 String 这样拥有所有权的值,其值将被移动而哈希 map 会成为这些值的所有者
    //println!("{}" ,yellow)//value borrowed here after move
    println!(
        " num : {} , keys :  {:?} , values : {:?}  ",
        num, keys, values
    ); //显然是可以的
    num = 1;
    println!(" num {}", num);

    //访问哈希 map 中的值
    for (key, value) in &map {
        println!(" 循环输出 map {}: {}", key, value);
    }

    if let Some(x) = map.get(&"yellow") {
        println!(" get {}", *x)
    }

    if let Some(x) = map.get_mut(&"yellow") {
        *x += 1;
        println!(" get_mut {}", *x)
    }

    //修改key:"yellow"的value
    println!(" 修改 yellow的value  {:?}", map);
    if let Some(x) = map.get_mut(&"yellow") {
        *x = 21;
    }
    println!(" 修改 yellow的value 21  {:?}", map);

    //修改
    map.insert("yellow", 22);
    println!(" 修改 yellow的value 22  {:?}", map);

    //只在键没有对应值时插入
    map.entry("yellow").or_insert(60);
    map.entry("green").or_insert(50);
    println!(" 添加 yellow的value 60  {:?}", map);
    println!(" 添加 green 的value 50  {:?}", map);

    //删除
    map.remove("yellow");
    println!(" 删除 yellow 的value   {:?}", map);

    //统计字符出现的次数
    let mut map3 = HashMap::new();
    for ch in "a short treatise on fungi".chars() {
        let counter = map3.entry(ch).or_insert(0);
        *counter += 1;
    }
    println!(" 统计字符出现的次数 : {:?}", map3);
}

console:

map : {"yellow": 50, "blue": 10} ,len : 2 ,capacity : 3
 map2 : {50: 50} ,len : 1 ,capacity : 14
 map3 : {"blue": 10, "yellow": 50} ,len : 2 ,capacity : 3
 num : 50 , keys :  ["blue", "yellow"] , values : [10, 50]  
 num 1
 循环输出 map yellow: 50
 循环输出 map blue: 10
 get 50
 get_mut 51
 修改 yellow的value  {"yellow": 51, "blue": 10}
 修改 yellow的value 21  {"yellow": 21, "blue": 10}
 修改 yellow的value 22  {"yellow": 22, "blue": 10}
 添加 yellow的value 60  {"green": 50, "yellow": 22, "blue": 10}
 添加 green 的value 50  {"green": 50, "yellow": 22, "blue": 10}
 删除 yellow 的value   {"green": 50, "blue": 10}
 统计字符出现的次数 : {'n': 2, ' ': 4, 'h': 1, 'f': 1, 'u': 1, 't': 3, 'g': 1, 'o': 2, 'e': 2, 'i': 2, 'a': 2, 's': 2, 'r': 2}

猜你喜欢

转载自blog.csdn.net/qq_39308071/article/details/114133900