Atualizando um Valor
Parte da seção Logic & Flow do Journey de Rust da Coddy — lição 32 de 66.
Às vezes, você precisa atualizar valores em um hash map de diferentes maneiras. Você já aprendeu que .insert() irá sobrescrever um valor existente, mas e se você quiser apenas adicionar um valor quando a chave ainda não existir?
Rust fornece a API .entry() para atualizações de valores mais sofisticadas. O método mais útil nesta API é .or_insert(), que insere um valor apenas se a chave ainda não estiver presente:
let mut scores = HashMap::new();
scores.insert("Alice", 85);
// Isso NÃO sobrescreverá a pontuação da Alice
scores.entry("Alice").or_insert(90);
// Isso IRÁ adicionar a pontuação do Bob, pois ele não está no mapa
scores.entry("Bob").or_insert(90);O método .entry() retorna um enum Entry que representa um espaço ocupado ou vazio no hash map. Quando você chama .or_insert() nele, ele apenas insere o novo valor se a entrada estiver vazia (a chave não existe).
Desafio
FácilVocê receberá um número inteiro n indicando a quantidade de nomes de jogadores a serem processados. Em seguida, você receberá n nomes de jogadores como entradas. Crie um hash map para rastrear as pontuações dos jogadores (tipo HashMap<String, i32>). Para cada nome de jogador recebido, use .entry() com .or_insert() para adicioná-los ao mapa com uma pontuação inicial de 100 apenas se eles ainda não existirem. Após processar todos os nomes, imprima cada jogador e sua pontuação.
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 nomes de jogadores - Use um loop para ler
nnomes de jogadores - Para cada nome de jogador, use
.entry(name).or_insert(100)para adicioná-los com uma pontuação de100caso ainda não estejam no mapa - Após processar todos os nomes, itere sobre o hash map e imprima as informações de cada jogador no formato:
[name]: [score]
Entrada:
- Primeira linha: Um número inteiro
n(ex:5) - Próximas
nlinhas: Nomes de jogadores (ex:Alice,Bob,Alice,Charlie,Bob)
Saída:
- Uma linha para cada jogador único no formato:
[name]: [score] - A ordem das linhas de saída pode variar entre as execuções de teste
Folha de consulta
A API .entry() fornece maneiras sofisticadas de atualizar valores em um hash map. O método .or_insert() insere um valor apenas se a chave ainda não existir:
let mut scores = HashMap::new();
scores.insert("Alice", 85);
// Isso NÃO irá sobrescrever a pontuação de Alice
scores.entry("Alice").or_insert(90);
// Isso IRÁ adicionar a pontuação de Bob, já que ele não está no mapa
scores.entry("Bob").or_insert(90);O método .entry() retorna um enum Entry que representa um espaço ocupado ou vago no hash map. Quando você chama .or_insert(), ele insere o novo valor apenas se a entrada estiver vaga (a chave não existe).
Experimente você mesmo
use std::collections::HashMap;
use std::io::{self, BufRead};
fn main() {
let stdin = io::stdin();
let mut lines = stdin.lock().lines();
// Lê o número de nomes de jogadores
let n: i32 = lines.next().unwrap().unwrap().trim().parse().unwrap();
// Cria um HashMap mutável para armazenar as pontuações dos jogadores
let mut player_scores: HashMap<String, i32> = HashMap::new();
// TODO: Escreva seu código abaixo
// Leia n nomes de jogadores e use .entry().or_insert(100) para adicioná-los ao mapa
// Imprima cada jogador e sua pontuação no formato: [name]: [score]
}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