Hash Maps

They aren't in the prelude. They must be added with use std::collections::HashMap; to make them available.

From the book

#![allow(unused)]
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");
let score = scores.get(&team_name).copied().unwrap_or(0);

println!("score {score}")
}

NOTE: Tried to setup the value with a string like this but it got an error:

scores.insert(String::from("Blue"), 10);

I think that's because .copied() is for i32. Overall, need to walk through that style syntax.


String keys and values get moved into the hashmap.

It's possible to use references with lifetimes


Overwriting a value (from the book)

#![allow(unused)]
fn main() {
use std::collections::HashMap;

let mut widget = HashMap::new();

widget.insert(String::from("alfa"), 3);
widget.insert(String::from("alfa"), 7);

println!("{:?}", widget)
}

Only add a values if it doesn't alrady exist.

#![allow(unused)]
fn main() {
use std::collections::HashMap;

let mut widget = HashMap::new();

widget.entry(String::from("alfa")).or_insert(3);
widget.entry(String::from("alfa")).or_insert(7);

println!("{:?}", widget)
}

This is from the book. Need to better understand it (and maybe come up with a refined example)

#![allow(unused)]
fn main() {
use std::collections::HashMap;

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);
}