[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

相关推荐
码力斜杠哥2 小时前
Rust初习录(6)Rust的 if 玩法
开发语言·python·rust
Rust研习社3 小时前
Rust 的 move 语义,一次讲透
后端·rust·编程语言
WMYeah7 小时前
【无标题】
前端·rust·抽奖程序·跨平台抽奖程序
楼兰公子20 小时前
buildroot 在编译rust时裁剪平台类型数量的方法
开发语言·后端·rust
Rust研习社1 天前
开源项目里的 deny.toml 是什么?
后端·rust·编程语言
铭毅天下1 天前
当搜索引擎遇上 Rust——深度解读下一代实时搜索引擎 INFINI Pizza
开发语言·后端·搜索引擎·rust
咸甜适中1 天前
rust语言学习笔记Trait之Default(默认值)
笔记·学习·rust
容智信息2 天前
AI Agent(智能体)的输出格式应该从 Markdown 转向 HTML吗?
前端·人工智能·rust·编辑器·html·prompt
Rust研习社2 天前
Rust Clippy 实用指南:写出更优雅、安全的 Rust 代码
后端·rust·编程语言