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
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 FinalPratique por conta própria: Compilador de Rust online