Menu
Coddy logo textTech

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).

challenge icon

Desafio

Fácil

Você 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 HashMap de std::collections
  • Crie um hash map mutável com os tipos HashMap<String, i32>
  • Leia a primeira entrada e converta-a para i32 para obter o número de nomes de jogadores
  • Use um loop para ler n nomes de jogadores
  • Para cada nome de jogador, use .entry(name).or_insert(100) para adicioná-los com uma pontuação de 100 caso 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 n linhas: 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]
    
}
quiz iconTeste seus conhecimentos

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