Iterando sobre um Hash Map
Parte da seção Logic & Flow do Journey de Rust da Coddy — lição 31 de 66.
Às vezes, você precisa examinar cada par chave-valor em seu hash map, em vez de procurar chaves específicas. O Rust fornece uma maneira simples de percorrer todos os dados usando um loop for:
for (key, value) in &my_map {
println!("{}: {}", key, value);
}Observe o & antes de my_map - isso cria uma referência para o hash map para que você possa iterar sem assumir a posse (ownership). O loop fornece cada par chave-valor como uma tupla que você pode desestruturar diretamente na declaração do loop.
Aqui está um exemplo prático com uma lista de preços:
let mut prices = HashMap::new();
prices.insert("apple", 1.20);
prices.insert("banana", 0.80);
for (item, price) in &prices {
println!("{} costs ${:.2}", item, price);
}Há um detalhe importante para lembrar: hash maps não garantem nenhuma ordem de iteração específica. Os pares podem aparecer em uma sequência diferente cada vez que você executa seu programa. Isso ocorre porque os hash maps priorizam buscas rápidas em vez de manter a ordem de inserção, portanto, não dependa dos itens aparecendo em qualquer sequência específica ao iterar.
Desafio
FácilVocê receberá um número inteiro n indicando o número de pares aluno-nota a serem processados. Em seguida, você receberá n pares de entradas: o nome de um aluno seguido por sua nota no teste (como um número inteiro). Crie um hash map para armazenar os nomes dos alunos como chaves e suas notas como valores. Após inserir todos os pares, itere sobre o hash map e imprima o nome e a nota de cada aluno.
Requisitos:
- Importe
HashMapdestd::collections - Crie um hash map mutável com os tipos
HashMap<String, i32> - Leia a primeira entrada e converta-a para
i32para obter o número de pares - Use um loop para ler
npares de entradas (nome do aluno, depois a nota) - Insira cada nome de aluno e nota no hash map
- Use um loop
forpara iterar sobre o hash map com&map - Imprima as informações de cada aluno no formato:
[name]: [score] - Imprima os pares em qualquer ordem (hash maps não garantem ordem)
Entrada:
- Primeira linha: Um número inteiro
n(ex:3) - Próximos
npares de linhas:- Nome do aluno (ex:
Alice) - Nota do teste como um número inteiro (ex:
95)
- Nome do aluno (ex:
Saída:
- Uma linha para cada aluno no formato:
[name]: [score] - A ordem das linhas de saída pode variar entre as execuções de teste
Folha de consulta
Para iterar sobre todos os pares chave-valor em um hash map, use um loop for com uma referência para o mapa:
for (key, value) in &my_map {
println!("{}: {}", key, value);
}O & antes do hash map cria uma referência, permitindo a iteração sem assumir a posse (ownership). O loop desestrutura cada par chave-valor como uma tupla.
Exemplo com um hash map:
let mut prices = HashMap::new();
prices.insert("apple", 1.20);
prices.insert("banana", 0.80);
for (item, price) in &prices {
println!("{} costs ${:.2}", item, price);
}Importante: Hash maps não garantem nenhuma ordem de iteração específica. Os pares podem aparecer em sequências diferentes cada vez que você executa seu programa, pois os hash maps priorizam buscas rápidas em vez de manter a ordem de inserção.
Experimente você mesmo
use std::collections::HashMap;
use std::io::{self, BufRead};
fn main() {
let stdin = io::stdin();
let mut lines = stdin.lock().lines();
// Leia o número de pares aluno-pontuação
let n: i32 = lines.next().unwrap().unwrap().trim().parse().unwrap();
// Crie um hash map mutável para armazenar nomes e pontuações dos alunos
let mut students: HashMap<String, i32> = HashMap::new();
// TODO: Escreva seu código abaixo
// Leia n pares de entradas (nome do aluno e pontuação) e insira-os no hash map
// TODO: Itere sobre o hash map e imprima o nome e a pontuação de cada aluno
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Logic & Flow
1Fluxo de Controle Avançado
A Expressão 'match'Correspondência de Múltiplos ValoresCorrespondência de IntervalosA Expressão 'if let'Loops como ExpressõesRecapitulação - Parser de Comandos Simples4Agrupando Dados com Structs
O que é uma Struct?Visão Geral de StructsAcessando Campos de uma StructStructs MutáveisStructs como Parâmetros de FunçãoTuple StructsRecapitulação - Criando uma Struct Book2Introdução a Vetores
O que é um Vetor?Criando um VetorAdicionando Elementos com pushAcessando Elementos do VetorIterando sobre um VetorIteração MutávelRemovendo ElementosRecapitulação - Rastreador de Pontuação Básico5Pares Chave-Valor com Hash Maps
O que é um Hash Map?Criando um Hash MapInserindo Pares Chave-ValorAcessando ValoresIterando sobre um Hash MapAtualizando um ValorRemovendo um ParRecapitulação - Contador de Palavras8Projeto: Inventário Simples de Itens
Configuração do ProjetoAdicionando um ItemVerificando o EstoqueVendendo um ItemJuntando tudo3Lista de Tarefas via Linha de Comando
Configuração do ProjetoAdicionando uma TarefaVisualizando Todas as TarefasRemovendo uma TarefaCódigo Final