rust的哈希表

这篇具有很好参考价值的文章主要介绍了rust的哈希表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

新建哈希表

fn main() {  
    use std::collections::HashMap;
    let mut scores = HashMap::new();
    scores.insert(String::from("Blue"), 10);
    scores.insert(String::from("Yellow"), 50);
    println!("{:?}",scores);
}

访问某个元素

fn main() {  
    use std::collections::HashMap;
    let mut scores = HashMap::new();
    scores.insert(String::from("Blue"), 10);
    scores.insert(String::from("Yellow"), 50);
    println!("value: {}",scores["Blue"]); // 存在则打印,不存在会panic
}
fn main() {  
    use std::collections::HashMap;
    let mut scores = HashMap::new();
    scores.insert(String::from("Blue"), 10);
    scores.insert(String::from("Yellow"), 50);
    let team_name = String::from("Blue");
    // scores.get(&team_name): 
    // 在scores哈希表(或者Dictionary)中查找对应team_name键(key)的值,返回的是一个Option类型
    // .copied(): 
    // Option类型上的方法,如果里面的值存在(在这里即scores.get(&team_name)查找到的值),就复制一个相同的值出来
    // .unwrap_or(0): 
    // 返回Option中包含的值或者一个默认值
    //
    // 如果使用如下方式,则报错:called `Option::unwrap()` on a `None` value
    // let team_name = String::from("Blue1");
    // let score = scores.get(&team_name).copied().unwrap();
    let score = scores.get(&team_name).copied().unwrap_or(0);
    println!("value: {}",score); // 10
}

以上两种方法都必须保证访问的元素存在,否则会报错

fn main() {
	use std::collections::HashMap;
	let mut map = HashMap::new();
	map.insert(1, "a");
	assert_eq!(map.get(&1), Some(&"a"));
	assert_eq!(map.get(&2), None);
}

插入新元素

fn main() {  
    use std::collections::HashMap;
    let mut scores = HashMap::new();
    scores.insert(String::from("Blue"), 10);
    scores.insert(String::from("Yellow"), 50);
    println!("{:?}",scores); //{"Yellow": 50, "Blue": 10}
    scores.insert(String::from("Red"), 100);
    println!("{:?}",scores);// {"Red": 100, "Yellow": 50, "Blue": 10}
}

哈希表中的元素没有顺序

遍历哈希表

fn main() {  
    use std::collections::HashMap;
    let mut scores = HashMap::new();
    scores.insert(String::from("Blue"), 10);
    scores.insert(String::from("Yellow"), 50);
    for (key, value) in &scores {
        println!("{key}: {value}");
    }
}

检查某个元素是否存在

两种方法,contains_key和entry

contains_key方法用于检查HashMap中是否包含特定的键
它返回一个布尔值,指示键是否存在。
entry方法用于高效地处理键值对的插入和更新
它返回一个Entry枚举,可以是Occupied(键已存在)或Vacant(键不存在)

fn main() {  
    use std::collections::HashMap;
    let mut scores = HashMap::new();
    scores.insert(String::from("Blue"), 10);
    scores.insert(String::from("Yellow"), 50);
    if scores.contains_key("Red"){
        println!("value :{}",scores["Red"]);
    }else {
        println!("Red is not found")
    }
}

entry方法多用于对值的更新
or_insert方法:
在键对应的值存在时,就返回这个值的可变引用
如果不存在,则将参数作为新值插入并返回新值的可变引用

fn main() {  
    use std::collections::HashMap;
    let mut scores = HashMap::new();
    scores.insert(String::from("Blue"), 10);
    scores.insert(String::from("Yellow"), 50);
    scores.entry(String::from("Red")).or_insert(100);
    scores.entry(String::from("Blue")).or_insert(50);
    println!("{:?}", scores);//{"Blue": 10, "Red": 100, "Yellow": 50}
}

元素更新

fn main() {  
    use std::collections::HashMap;
    let mut scores = HashMap::new();
    scores.insert(String::from("Blue"), 10);
    scores.insert(String::from("Yellow"), 50);
    let team_list =["Blue","Red"];
    for i in team_list{
        if scores.contains_key(i){
            scores.insert(i.to_string(), scores[i]+50);
        }else{
            scores.insert(i.to_string(), 50);
        }
    }
    println!("{:?}",scores);//{"Red": 50, "Blue": 60, "Yellow": 50}
}
fn main() {  
    use std::collections::HashMap;
    let mut scores = HashMap::new();
    scores.insert(String::from("Blue"), 10);
    scores.insert(String::from("Yellow"), 50);
    let team_list =["Blue","Red"];
    for i in team_list{
        let count = scores.entry(i.to_string()).or_insert(0);
        *count += 50;
    }
    println!("{:?}",scores);//{"Red": 50, "Blue": 60, "Yellow": 50}
}

相比contains_key+insert ,这种方法更优雅文章来源地址https://www.toymoban.com/news/detail-827668.html

删除元素

fn main() {  
    use std::collections::HashMap;

    let mut scores = HashMap::new();
    scores.insert(String::from("Blue"), 10);
    scores.insert(String::from("Yellow"), 50);
    scores.insert(String::from("Red"), 80);
    println!("{:?}",scores);//{"Blue": 10, "Yellow": 50, "Red": 80}
    scores.remove("Red1");
    println!("{:?}",scores);//{"Blue": 10, "Yellow": 50, "Red": 80}
    scores.remove("Red");
    println!("{:?}",scores);//{"Blue": 10, "Yellow": 50}
}

到了这里,关于rust的哈希表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 哈希表-散列表数据结构

    哈希表也叫散列表,哈希表是根据关键码值(key value)来直接访问的一种数据结构,也就是将关键码值(key value)通过一种映射关系映射到表中的一个位置来加快查找的速度,这种映射关系称之为哈希函数或者散列函数,存放记录的数组称之为哈希表。 哈希表采用的是一种转换思

    2024年01月21日
    浏览(55)
  • HELLO算法笔记之散列表(哈希)

    一、哈希表 建立键  key  与值  value  之间的映射,实现高效的元素查询。输入一个key,以O(1)获取对应的value 遍历: 知识点1、哈希函数: 将一个较大的输入空间映射到一个较小的输出空间。在哈希表中,输入空间是所有  key  ,输出空间是所有桶(数组索引)。换句话

    2024年02月10日
    浏览(36)
  • 哈希表/散列表(HashTable)c++实现

    目录 哈希表实现的思想 除留余数法  哈希冲突 第一种方法:探测法实现哈希表 探测法的思想  结点类  插入数据(insert) 冲突因子 数据扩容 哈希值  插入的代码实现以及哈希类 查找数据(find) 删除数据(erase) 第二种方法:拉链法实现哈希表 结点类 哈希类的成员 插入(insert)

    2024年02月10日
    浏览(45)
  • 数据结构算法设计——哈希表(散列表)

            哈希表 又叫 散列表 ,他们两个是同一个东西,本文全文采用“散列表”的叫法。散列表的本质其实就是一个 数组 ,他的作用就像使用数组时一样,输入下标可以得到对应元素,散列表可以实现 输入一个的时候得到这个的地址信息 。 下面是百科给出

    2024年02月03日
    浏览(59)
  • 【数据结构与算法】04 哈希表 / 散列表 (哈希函数、哈希冲突、链地址法、开放地址法、SHA256)

    一种很好用,很高效,又一学就会的数据结构,你确定不看看? 莫慌,每个概念都很好理解。 哈希表( Hash Table ),也称为 散列表 ,是一种数据结构, 用于存储键值对(key-value pairs) 。 键值对是一种数据结构,用于将键(key)与对应的值(value)相关联。在键值对中,键

    2024年02月09日
    浏览(78)
  • 哈希表(散列表)的平均查找成功/失败长度

    计算哈希地址的方法,称之为哈希函数。 常见的计算哈希地址方法有: 1、直接定址法 2、除留余数法 3、数字分析法 4、平方取中法 本文所分析的是使用除留余数法计算哈希地址这类,的平均查找成功长度和查找失败长度 对于除留余数法的哈希函数(散列函数) H(key) = key

    2024年02月07日
    浏览(45)
  • 【数据结构(C++版)】哈希表(散列表)

    目录   1. 散列表的概念 2. 散列函数的构造方法 2.1 直接定址法 2.2 除留余数法 2.3 数字分析法 2.4 平方取中法 3. 处理冲突的方法 3.1 开放定址法 3.1.1 线性探测法 3.1.2 平方探测法 3.1.3 双散列法 3.1.4 伪随机序列法 3.2 拉链法(链接法) 4. 散列查找及性能分析 5. 哈希的应用 5.1 位

    2024年02月15日
    浏览(45)
  • rust踩雷笔记(2)——一道hard带来的思考[哈希表、字符串、滑动窗口]

    今天被一道hard恶心坏了,算法不难,用C++几分钟的事。用rust主要还是缺乏对语言的熟练度,记录一下,主要的坑在下面这个操作: 对String取其中某个位置的char。 可能你会有疑问:这不是直接nth()取就行了么。没错,我看有些题解也是这样做的,但是那样会在某些字符长度很

    2024年02月12日
    浏览(34)
  • Massa用到的主流Rust库列表

        Updating crates.io index     Updating git repository `https://github.com/massalabs/massa-sc-runtime`     Updating git repository `https://github.com/massalabs/transition.git`     Updating git repository `https://github.com/massalabs/PeerNet`     Updating git repository `https://github.com/massalabs/as-ffi-bindings.git`   Downloaded bytecheck_d

    2024年02月09日
    浏览(25)
  • Java学数据结构(4)——散列表Hash table & 散列函数 & 哈希冲突

    1.散列表,key,散列函数; 2.哈希冲突的解决; 3.string中的hashCode; 查找树ADT,它允许对元素的集合进行各种操作。本章讨论散列表(hash table)ADT,不过它只支持二叉查找树所允许的一部分操作。散列表的实现常常叫作散列(hashing)。散列是一种用于以常数平均时间执行插入、删除和

    2024年02月10日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包