[rustlings]11_hashmaps

HashMap<K, V> 类型储存了一个键类型 K 对应一个值类型 V 的映射。它通过一个 哈希函数(hashing function)来实现映射,决定如何将键和值放入内存中。

HashMap

复制代码
use std::collections::HashMap;

fn main() {
    // 创建一个新的 HashMap
    let mut my_map: HashMap<String, i32> = HashMap::new();

    // 插入键值对
    my_map.insert(String::from("apple"), 3);
    my_map.insert(String::from("banana"), 2);
    my_map.insert(String::from("orange"), 5);

    // 查询值
    if let Some(value) = my_map.get("banana") {
        println!("The value of 'banana' is: {}", value);
    } else {
        println!("'banana' key not found");
    }

    // 更新值
    my_map.insert(String::from("apple"), 4);

    // 删除键值对
    my_map.remove("orange");

    // 遍历 HashMap
    for (key, value) in my_map.iter() {
        println!("{}: {}", key, value);
    }
}

https://rustwiki.org/zh-CN/book/ch08-03-hash-maps.html

复制代码
pub fn or_insert_with<F: FnOnce() -> V>(self, default: F) -> &'a mut V
如果为空,则通过插入默认函数的结果来确保该值在条目中,并返回对条目中值的可变引用。

use std::collections::HashMap;

let mut map: HashMap<&str, String> = HashMap::new();
let s = "hoho".to_string();

map.entry("poneyland").or_insert_with(|| s);

assert_eq!(map["poneyland"], "hoho".to_string());

hashmaps3.rs

复制代码
// A list of scores (one per line) of a soccer match is given. Each line is of
// the form "<team_1_name>,<team_2_name>,<team_1_goals>,<team_2_goals>"
// Example: "England,France,4,2" (England scored 4 goals, France 2).
//
// You have to build a scores table containing the name of the team, the total
// number of goals the team scored, and the total number of goals the team
// conceded.

use std::collections::HashMap;

// A structure to store the goal details of a team.
#[derive(Default)]
struct Team {
    goals_scored: u8,
    goals_conceded: u8,
}

fn build_scores_table(results: &str) -> HashMap<&str, Team> {
    // The name of the team is the key and its associated struct is the value.
    let mut scores = HashMap::new();

    for line in results.lines() {
        let mut split_iterator = line.split(',');
        // NOTE: We use `unwrap` because we didn't deal with error handling yet.
        let team_1_name = split_iterator.next().unwrap();
        let team_2_name = split_iterator.next().unwrap();
        let team_1_score: u8 = split_iterator.next().unwrap().parse().unwrap();
        let team_2_score: u8 = split_iterator.next().unwrap().parse().unwrap();

        // TODO: Populate the scores table with the extracted details.
        // Keep in mind that goals scored by team 1 will be the number of goals
        // conceded by team 2. Similarly, goals scored by team 2 will be the
        // number of goals conceded by team 1.
        scores.entry(team_1_name).or_insert_with(Team::default).goals_scored += team_1_score;
        scores.entry(team_1_name).or_insert_with(Team::default).goals_conceded += team_2_score;
        scores.entry(team_2_name).or_insert_with(Team::default).goals_scored += team_2_score;
        scores.entry(team_2_name).or_insert_with(Team::default).goals_conceded += team_1_score;
    }

    scores
}

fn main() {
    // You can optionally experiment here.
}

#[cfg(test)]
mod tests {
    use super::*;

    const RESULTS: &str = "England,France,4,2
France,Italy,3,1
Poland,Spain,2,0
Germany,England,2,1
England,Spain,1,0";

    #[test]
    fn build_scores() {
        let scores = build_scores_table(RESULTS);

        assert!(["England", "France", "Germany", "Italy", "Poland", "Spain"]
            .into_iter()
            .all(|team_name| scores.contains_key(team_name)));
    }

    #[test]
    fn validate_team_score_1() {
        let scores = build_scores_table(RESULTS);
        let team = scores.get("England").unwrap();
        assert_eq!(team.goals_scored, 6);
        assert_eq!(team.goals_conceded, 4);
    }

    #[test]
    fn validate_team_score_2() {
        let scores = build_scores_table(RESULTS);
        let team = scores.get("Spain").unwrap();
        assert_eq!(team.goals_scored, 0);
        assert_eq!(team.goals_conceded, 3);
    }
}

参考:

https://github.com/rust-lang/rustlings

https://rustwiki.org/zh-CN/book/ch08-03-hash-maps.html

相关推荐
传奇开心果编程6 小时前
【Xilem 0.4 基础语法学与练】第一课:从零到计数器
学习·rust·前端框架
Flynt13 小时前
pnpm 12 换上了 Rust 内核,我拿项目实测了一轮构建速度
rust·vite·前端工程化
传奇开心果编程17 小时前
【Xilem基础语法学与练】第8课:条件渲染(one_of)
学习·rust·前端框架
qwsaedca18 小时前
在Mac上跑 Kokoro TTS经验总结
rust·mac·tts
qwsaedca19 小时前
Kokoro TTS v1.1 voices 文件格式逆向分析
rust
老猿讲编程21 小时前
【Eclipse OpenSOVD学习之五】拓扑引擎(Topology)
学习·rust·eclipse·sovd
object not found21 小时前
Nuxt4去掉body中默认的边距
开发语言·后端·rust
梦醒沉醉2 天前
4、Rust参考手册——Crate和源文件
rust
chainbees2 天前
Windows 系统 Rust 运行环境搭建
rust