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.
Desafio
FácilCrie 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:
- Ler uma entrada de string representando o nome do torneio
- Ler múltiplos pares de entradas representando nomes de jogadores e suas pontuações atuais (a entrada terminará quando você receber
"scores_done") - Ler múltiplas entradas de string representando novos jogadores que desejam participar do torneio (a entrada terminará quando você receber
"players_done") - Criar um Map para armazenar nomes de jogadores como chaves e suas pontuações como valores
- 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 - 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 successfullySe 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 successfullySe 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 successfullySeu 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");
}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
1Manipulação Avançada de Listas
Propriedades de Lista: first & lastEstado da Lista: isEmpty & isNotEmptyInvertendo uma ListaAdicionando a uma Lista: insertRemoção em Listas: removeWhereBuscando em uma Lista: indexOfOrdenando uma ListaEmbaralhando uma ListaRecapitulação - Organizador de Listas4Manipulação Avançada de Mapas
Iterando sobre um MapVerificando Chaves e ValoresPropriedades do Map: keys & valuesAdição Condicional: putIfAbsentRemovendo Entradas de um MapMaps AninhadosRecapitulação - Atualização de Inventário2Operações Funcionais em Listas
Transformando com 'map'Filtrando com 'where'Usando '.toList()'Verificando Condições com 'any'Condições com 'every'Encontrando com 'firstWhere'Recapitulação - Filtragem de Dados5Projeto: Cálculo de Carrinho de Compras
Configuração do ProjetoAdicionando Itens ao Carrinho3Conjuntos
O que é um Conjunto?Criando um ConjuntoAdicionando e Removendo de ConjuntosVerificando Elementos em um ConjuntoConvertendo uma Lista para um ConjuntoUnião de ConjuntosInterseção de ConjuntosDiferença de ConjuntosRecapitulação - Lista de Convidados Únicos