Menu
Coddy logo textTech

Adição Condicional: putIfAbsent

Parte da seção Lógica & Fluxo do Journey de Dart da Coddy — lição 29 de 65.

Às vezes você precisa adicionar um par chave-valor a um Map, mas apenas se essa chave ainda não existir. O método putIfAbsent() lida com essa situação perfeitamente, adicionando a entrada apenas quando a chave estiver ausente no mapa.

Este método recebe dois parâmetros: a chave a ser verificada e o valor a ser adicionado caso a chave esteja ausente. Se a chave já existir, o putIfAbsent() não faz nada e deixa o valor existente inalterado. Se a chave estiver faltando, ele adiciona o novo par chave-valor ao mapa.

Map<String, int> gameScores = {
  'Alice': 150,
  'Bob': 200
};

// Isso adicionará Charlie, pois ele não está no mapa
gameScores.putIfAbsent('Charlie', () => 0);
print(gameScores);  // {Alice: 150, Bob: 200, Charlie: 0}

// Isso não alterará a pontuação de Alice, pois ela já existe
gameScores.putIfAbsent('Alice', () => 0);
print(gameScores);  // {Alice: 150, Bob: 200, Charlie: 0}

O método putIfAbsent() é particularmente útil para inicializar valores padrão, como configurar novas contas de usuário ou garantir que certas chaves existam antes de realizar operações nelas. É uma maneira segura de adicionar dados sem sobrescrever acidentalmente informações existentes.

challenge icon

Desafio

Fácil

Crie um programa que gerencie um sistema de registro de torneio de jogos, rastreando as pontuações dos jogadores e garantindo que todos os jogadores tenham valores iniciais padrão. Seu programa deve:

  1. Ler uma entrada de string representando o nome do torneio
  2. Ler múltiplos pares de entradas representando nomes de jogadores e suas pontuações atuais (a entrada terminará quando você receber "scores_done")
  3. Ler múltiplas entradas de string representando novos jogadores que desejam participar do torneio (a entrada terminará quando você receber "players_done")
  4. Criar um Map para armazenar nomes de jogadores como chaves e suas pontuações como valores
  5. Usar o método putIfAbsent() para adicionar cada novo jogador com uma pontuação padrão de 0, mas apenas se eles ainda não estiverem registrados
  6. Calcular as estatísticas do torneio e imprimir o relatório de registro no formato exato mostrado abaixo

Por exemplo, se o nome do torneio for "Spring Championship", as pontuações existentes incluírem "Alice" com 150, "Bob" com 200, "Charlie" com 75, e os novos jogadores forem "Diana", "Alice", "Eve", seu programa deve exibir:

Tournament: Spring Championship
Initial Scores: {Alice: 150, Bob: 200, Charlie: 75}
Registration Process:
Adding Diana: New player registered with score 0
Adding Alice: Player already exists, keeping score 150
Adding Eve: New player registered with score 0
Final Scores: {Alice: 150, Bob: 200, Charlie: 75, Diana: 0, Eve: 0}
Tournament Statistics:
Total registered players: 5
Players with scores above 0: 3
New players added: 2
Average score: 85.0
Status: Registration completed successfully

Se o nome do torneio for "Winter Cup", as pontuações existentes incluírem "John" com 300, "Mary" com 250, e os novos jogadores forem "Sarah", "Tom", "John", seu programa deve exibir:

Tournament: Winter Cup
Initial Scores: {John: 300, Mary: 250}
Registration Process:
Adding Sarah: New player registered with score 0
Adding Tom: New player registered with score 0
Adding John: Player already exists, keeping score 300
Final Scores: {John: 300, Mary: 250, Sarah: 0, Tom: 0}
Tournament Statistics:
Total registered players: 4
Players with scores above 0: 2
New players added: 2
Average score: 137.5
Status: Registration completed successfully

Se o nome do torneio for "Summer League", as pontuações existentes incluírem "Alex" com 180, "Jordan" com 220, "Taylor" com 160, "Morgan" com 190, e os novos jogadores forem "Casey", "Riley", seu programa deve exibir:

Tournament: Summer League
Initial Scores: {Alex: 180, Jordan: 220, Taylor: 160, Morgan: 190}
Registration Process:
Adding Casey: New player registered with score 0
Adding Riley: New player registered with score 0
Final Scores: {Alex: 180, Jordan: 220, Taylor: 160, Morgan: 190, Casey: 0, Riley: 0}
Tournament Statistics:
Total registered players: 6
Players with scores above 0: 4
New players added: 2
Average score: 158.33333333333334
Status: Registration completed successfully

Seu programa deve usar o método putIfAbsent() para adicionar novos jogadores com uma pontuação padrão de 0, garantindo que os jogadores existentes mantenham suas pontuações atuais inalteradas. Calcule a pontuação média dividindo o total de todas as pontuações pelo número de jogadores. Conte quantos jogadores têm pontuações acima de 0 e quantos novos jogadores foram realmente adicionados (excluindo aqueles que já estavam registrados). O formato de entrada será: nome do torneio, depois nomes de jogadores e pontuações alternados (como strings que precisam ser convertidas para inteiros), terminando com "scores_done", seguido por novos nomes de jogadores terminando com "players_done".

Folha de consulta

O método putIfAbsent() adiciona um par chave-valor a um Map apenas se a chave ainda não existir:

Map<String, int> gameScores = {
  'Alice': 150,
  'Bob': 200
};

// Adiciona Charlie, pois ele não está no mapa
gameScores.putIfAbsent('Charlie', () => 0);

// Não alterará a pontuação de Alice, pois ela já existe
gameScores.putIfAbsent('Alice', () => 0);

Este método é útil para inicializar valores padrão sem sobrescrever dados existentes.

Experimente você mesmo

import 'dart:io';

void main() {
  // Ler o nome do torneio
  String? tournamentName = stdin.readLineSync();
  
  // Criar um mapa para armazenar as pontuações dos jogadores
  Map<String, int> playerScores = {};
  
  // Ler as pontuações existentes dos jogadores
  while (true) {
    String? input = stdin.readLineSync();
    if (input == "scores_done") break;
    
    String playerName = input!;
    String? scoreInput = stdin.readLineSync();
    int score = int.parse(scoreInput!);
    playerScores[playerName] = score;
  }
  
  // Armazenar as pontuações iniciais para exibição
  Map<String, int> initialScores = Map.from(playerScores);
  
  // Ler novos jogadores para registrar
  List<String> newPlayers = [];
  while (true) {
    String? input = stdin.readLineSync();
    if (input == "players_done") break;
    newPlayers.add(input!);
  }
  
  // TODO: Escreva seu código abaixo
  // Use o método putIfAbsent() para adicionar novos jogadores com pontuação padrão 0
  // Acompanhar o processo de registro e calcular estatísticas
  
  // Imprimir o relatório de registro do torneio
  print("Tournament: $tournamentName");
  print("Initial Scores: $initialScores");
  print("Registration Process:");
  // Imprimir detalhes do processo de registro aqui
  print("Final Scores: $playerScores");
  print("Tournament Statistics:");
  // Imprimir estatísticas aqui
  print("Status: Registration completed successfully");
}
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 Lógica & Fluxo