HashMap
A última coleção que iremos falar é o HashMap, esta coleção funciona como um HashSet, porém com o conceito de chave-valor, onde temos uma chave associada a um valor, esta chave NÃO se repete, assim como um valor em um HashSet, porém para inserirmos e recuperarmos valores, utilizamos a chave. Assim como no HashSet, essa chave deve implementar Eq e Hash e para implementar Eq é necessário implementar PartialEq.
Criando um HashMap
Para criar um HashMap, precisamos informar dois tipos genéricos.
use std::collections::HashMap; fn main() { let mut map1 = HashMap::<String, i32>::new(); let mut map2: HashMap<String, i32> = HashMap::new(); let mut map3 = HashMap::new(); map3.insert("Rust4Noobs".to_string(), i32::MAX); }
Temos vários métodos para criar um HashMap, acima temos alguns exemplos. Os métodos que iremos falar serão, insert, remove, get, get_mut, len, remove, clear.
Método insert
Para inserirmos uma chave e valor em um HashMap precisamos utilizar o método insert passando como argumentos uma chavee um valor este método nos retorna um Option.
use std::collections::HashMap; fn main() { let mut map = HashMap::new(); map.insert("Rust4Noobs", i32::MAX); }
O método insert tem uma peculiaridade, ao inserir um valor e este valor ainda não existe, o Option retornado sera um None e o valor será inserido no HashMap, caso o valor já exista o Option retornado sera um Some com o valor antigo e este valor é substituído na coleção.
use std::collections::HashMap; fn main() { let mut map = HashMap::new(); let inserido = map.insert("Rust4Noobs", i32::MAX); println!("{:?}", inserido); let inserido = map.insert("Rust4Noobs", i32::MIN); println!("{:?}", inserido); }
Método get
O método get funciona de maneira parecida com o Vec e o Set, porém passamos uma chave e nos é devolvido um Option. Caso o valor exista temos um Some com o valor caso não temos um None.
use std::collections::HashMap; fn main() { let mut map = HashMap::new(); map.insert("Rust4Noobs", i32::MAX); let rust4_noobs = map.get("Rust4Noobs"); let rust4_experts = map.get("Rust4Experts"); println!("{:?}", rust4_noobs); println!("{:?}", rust4_experts); }
Método get_mut
O método get_mut do mesmo modo que o método get, com a diferença de nos retornar uma referência mutável do valor e somente pode ser usado caso o HashMap seja mutável.
use std::collections::HashMap; #[derive(PartialEq, Eq, Hash, Debug)] struct Cliente { id: i32, nome: String } fn main() { let mut map = HashMap::new(); map.insert("Rust4Noobs", Cliente { id: 0, nome: "https://github.com/pgjbz/rust4noobs".to_string()}); let rust4_noobs = map.get_mut("Rust4Noobs"); println!("{:?}", rust4_noobs); if let Some(rust) = rust4_noobs { rust.nome = "Nome Brabo".to_string(); } let rust4_noobs = map.get_mut("Rust4Noobs"); println!("{:?}", rust4_noobs); }
Sim, podemos redeclarar uma variável com um nome já existente e eu só mostrei isso agora, eu errei, eu sei
Método len
O método len nos retorna o tamanho do HashMap.
use std::collections::HashMap; fn main() { let mut map = HashMap::new(); map.insert("Rust4Noobs", i32::MAX); let len = map.len(); println!("len = {}", len); }
Método remove
Utilizamos o método remove quando queremos remover alguma chave do nosso HashMap, nos retornando um Option, sendo Some contendo o valor removido, caso o valor exista e tenha sido removido e None caso o valor removido não exista.
use std::collections::HashMap; fn main() { let mut map = HashMap::new(); map.insert("Rust4Noobs", i32::MAX); let rust4_noobs = map.get("Rust4Noobs"); println!("Rust4Noobs {:?}", rust4_noobs); let valor_removido = map.remove("Rust4Noobs"); println!("Valor removido {:?}", valor_removido); let rust4_noobs = map.get("Rust4Noobs"); println!("Rust4Noobs {:?}", rust4_noobs); }
Método clear
O método clear é o mais simples dentre todos, este método apenas, limpa o nosso HashSet.
use std::collections::HashMap; fn main() { let mut map = HashMap::new(); map.insert("Rust4Noobs", i32::MAX); map.clear(); println!("Tamanho do HashSet = {}", map.len()); }