Adición condicional: putIfAbsent
Parte de la sección Lógica y Flujo del Journey de Dart de Coddy — lección 29 de 65.
A veces necesitas añadir un par clave-valor a un Map, pero solo si esa clave no existe ya. El método putIfAbsent() maneja esta situación perfectamente añadiendo la entrada solo cuando la clave falta en el mapa.
Este método toma dos parámetros: la clave que se va a comprobar y el valor que se va a añadir si la clave está ausente. Si la clave ya existe, putIfAbsent() no hace nada y deja el valor existente sin cambios. Si falta la clave, añade el nuevo par clave-valor al mapa.
Map<String, int> gameScores = {
'Alice': 150,
'Bob': 200
};
// Esto añadirá a Charlie ya que no está en el mapa
gameScores.putIfAbsent('Charlie', () => 0);
print(gameScores); // {Alice: 150, Bob: 200, Charlie: 0}
// Esto no cambiará la puntuación de Alice ya que ella ya existe
gameScores.putIfAbsent('Alice', () => 0);
print(gameScores); // {Alice: 150, Bob: 200, Charlie: 0}El método putIfAbsent() es particularmente útil para inicializar valores predeterminados, como configurar nuevas cuentas de usuario o asegurar que ciertas claves existan antes de realizar operaciones sobre ellas. Es una forma segura de agregar datos sin sobrescribir accidentalmente la información existente.
Desafío
FácilCrea un programa que gestione un sistema de registro para un torneo de videojuegos, realizando un seguimiento de las puntuaciones de los jugadores y asegurando que todos los jugadores tengan valores iniciales por defecto. Tu programa debe:
- Leer una entrada de cadena que represente el nombre del torneo
- Leer múltiples pares de entradas que representen los nombres de los jugadores y sus puntuaciones actuales (la entrada terminará cuando recibas
"scores_done") - Leer múltiples entradas de cadena que representen a los nuevos jugadores que desean unirse al torneo (la entrada terminará cuando recibas
"players_done") - Crear un Map para almacenar los nombres de los jugadores como claves y sus puntuaciones como valores
- Usar el método
putIfAbsent()para añadir a cada nuevo jugador con una puntuación por defecto de 0, pero solo si aún no están registrados - Calcular las estadísticas del torneo e imprimir el informe de registro en el formato exacto que se muestra a continuación
Por ejemplo, si el nombre del torneo es "Spring Championship", las puntuaciones existentes incluyen a "Alice" con 150, "Bob" con 200, "Charlie" con 75, y los nuevos jugadores son "Diana", "Alice", "Eve", tu programa debería mostrar:
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 successfullySi el nombre del torneo es "Winter Cup", las puntuaciones existentes incluyen a "John" con 300, "Mary" con 250, y los nuevos jugadores son "Sarah", "Tom", "John", tu programa debería mostrar:
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 successfullySi el nombre del torneo es "Summer League", las puntuaciones existentes incluyen a "Alex" con 180, "Jordan" con 220, "Taylor" con 160, "Morgan" con 190, y los nuevos jugadores son "Casey", "Riley", tu programa debería mostrar:
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 successfullyTu programa debe usar el método putIfAbsent() para añadir nuevos jugadores con una puntuación por defecto de 0, asegurando que los jugadores existentes mantengan sus puntuaciones actuales sin cambios. Calcula la puntuación media dividiendo el total de todas las puntuaciones por el número de jugadores. Cuenta cuántos jugadores tienen puntuaciones superiores a 0 y cuántos nuevos jugadores fueron realmente añadidos (excluyendo a aquellos que ya estaban registrados). El formato de entrada será: nombre del torneo, luego nombres de jugadores y puntuaciones alternados (como cadenas que deben convertirse a enteros), terminando con "scores_done", seguido de los nombres de los nuevos jugadores terminando con "players_done".
Hoja de referencia
El método putIfAbsent() añade un par clave-valor a un Map solo si la clave aún no existe:
Map<String, int> gameScores = {
'Alice': 150,
'Bob': 200
};
// Añade a Charlie ya que no está en el mapa
gameScores.putIfAbsent('Charlie', () => 0);
// No cambiará la puntuación de Alice ya que ella ya existe
gameScores.putIfAbsent('Alice', () => 0);Este método es útil para inicializar valores predeterminados sin sobrescribir los datos existentes.
Pruébalo tú mismo
import 'dart:io';
void main() {
// Leer el nombre del torneo
String? tournamentName = stdin.readLineSync();
// Crear un mapa para almacenar las puntuaciones de los jugadores
Map<String, int> playerScores = {};
// Leer las puntuaciones de los jugadores existentes
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;
}
// Almacenar las puntuaciones iniciales para su visualización
Map<String, int> initialScores = Map.from(playerScores);
// Leer nuevos jugadores para registrar
List<String> newPlayers = [];
while (true) {
String? input = stdin.readLineSync();
if (input == "players_done") break;
newPlayers.add(input!);
}
// TODO: Escribe tu código a continuación
// Usa el método putIfAbsent() para añadir nuevos jugadores con una puntuación predeterminada de 0
// Realiza el seguimiento del proceso de registro y calcula las estadísticas
// Imprimir el informe de registro del torneo
print("Tournament: $tournamentName");
print("Initial Scores: $initialScores");
print("Registration Process:");
// Imprimir los detalles del proceso de registro aquí
print("Final Scores: $playerScores");
print("Tournament Statistics:");
// Imprimir las estadísticas aquí
print("Status: Registration completed successfully");
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y Flujo
1Manipulación avanzada de listas
Propiedades de listas: first y lastEstado de la lista: isEmpty y isNotEmptyInvertir una listaAñadir a una lista: insertEliminación en listas: removeWhereBúsqueda en una lista: indexOfOrdenar una listaMezclar una listaResumen - Organizador de listas4Manipulación avanzada de mapas
Iterar sobre un mapaComprobación de claves y valoresPropiedades del mapa: keys y valuesAdición condicional: putIfAbsentEliminar entradas de un mapaMapas anidadosResumen - Actualización de inventario2Operaciones funcionales con listas
Transformar con 'map'Filtrar con 'where'Uso de '.toList()'Comprobar condiciones con 'any'Condiciones con 'every'Búsqueda con 'firstWhere'Resumen - Filtrado de datos5Proyecto: Calculadora de carrito de compras
Configuración del proyectoAgregar artículos al carrito3Conjuntos
¿Qué es un Conjunto?Crear un ConjuntoAñadir y eliminar elementos de un ConjuntoComprobar elementos en un ConjuntoConvertir una lista en un ConjuntoUnión de ConjuntosIntersección de ConjuntosDiferencia de ConjuntosResumen - Lista de invitados única