Aggiunta condizionale: putIfAbsent
Fa parte della sezione Logica e flusso del percorso Dart di Coddy. Lezione 29 di 65.
A volte devi aggiungere una coppia chiave-valore a una Map, ma solo se quella chiave non esiste già. Il metodo putIfAbsent() gestisce perfettamente questa situazione, aggiungendo la voce solo quando la chiave manca nella mappa.
Questo metodo accetta due parametri: la chiave da verificare e il valore da aggiungere se la chiave è assente. Se la chiave esiste già, putIfAbsent() non fa nulla e lascia invariato il valore esistente. Se la chiave è assente, aggiunge la nuova coppia chiave-valore alla mappa.
Map<String, int> gameScores = {
'Alice': 150,
'Bob': 200
};
// Esto añadirá a Charlie porque 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 porque ya existe
gameScores.putIfAbsent('Alice', () => 0);
print(gameScores); // {Alice: 150, Bob: 200, Charlie: 0}Il metodo putIfAbsent() è particolarmente utile per inizializzare i valori predefiniti, ad esempio durante la configurazione di nuovi account utente o per assicurarsi che determinate chiavi esistano prima di eseguire operazioni su di esse. È un modo sicuro per aggiungere dati senza sovrascrivere accidentalmente le informazioni esistenti.
Sfida
FacileCrea un programma che gestisca un sistema di registrazione a un torneo di videogiochi, tenendo traccia dei punteggi dei giocatori e assicurandosi che tutti i giocatori abbiano valori iniziali predefiniti. Il tuo programma deve:
- Leggere una stringa di input che rappresenta il nome del torneo
- Leggere più coppie di input che rappresentano i nomi dei giocatori e i loro punteggi attuali (l’input terminerà quando riceverai
"scores_done") - Leggere più stringhe di input che rappresentano i nuovi giocatori che vogliono partecipare al torneo (l’input terminerà quando riceverai
"players_done") - Creare una Map per memorizzare i nomi dei giocatori come chiavi e i loro punteggi come valori
- Usare il metodo
putIfAbsent()per aggiungere ogni nuovo giocatore con un punteggio predefinito di 0, ma solo se non è già registrato - Calcolare le statistiche del torneo e stampare il resoconto delle iscrizioni nel formato esatto mostrato di seguito
Ad esempio, se il nome del torneo è "Spring Championship", i punteggi esistenti includono "Alice" con 150, "Bob" con 200, "Charlie" con 75 e i nuovi giocatori sono "Diana", "Alice", "Eve", il tuo programma dovrebbe produrre:
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 il nome del torneo è "Winter Cup", i punteggi esistenti includono "John" con 300, "Mary" con 250 e i nuovi giocatori sono "Sarah", "Tom", "John", il tuo programma dovrebbe produrre:
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 il nome del torneo è "Summer League", i punteggi esistenti includono "Alex" con 180, "Jordan" con 220, "Taylor" con 160, "Morgan" con 190 e i nuovi giocatori sono "Casey", "Riley", il tuo programma dovrebbe produrre:
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 successfullyIl tuo programma deve usare il metodo putIfAbsent() per aggiungere nuovi giocatori con un punteggio predefinito di 0, assicurandosi che i giocatori già registrati mantengano invariati i loro punteggi attuali. Calcola il punteggio medio dividendo il totale di tutti i punteggi per il numero di giocatori. Conta quanti giocatori hanno punteggi superiori a 0 e quanti nuovi giocatori sono stati effettivamente aggiunti (escludendo quelli già registrati). Il formato dell’input sarà: nome del torneo, poi nomi dei giocatori e punteggi alternati (come stringhe da convertire in numeri interi), fino a "scores_done", seguiti dai nomi dei nuovi giocatori fino a "players_done".
Provalo tu
import 'dart:io';
void main() {
// Leggi il nome del torneo
String? tournamentName = stdin.readLineSync();
// Crea una mappa per memorizzare i punteggi dei giocatori
Map<String, int> playerScores = {};
// Leggi i punteggi dei giocatori esistenti
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;
}
// Memorizza i punteggi iniziali per visualizzarli
Map<String, int> initialScores = Map.from(playerScores);
// Leggi i nuovi giocatori da registrare
List<String> newPlayers = [];
while (true) {
String? input = stdin.readLineSync();
if (input == "players_done") break;
newPlayers.add(input!);
}
// TODO: Scrivi il tuo codice qui sotto
// Usa il metodo putIfAbsent() per aggiungere nuovi giocatori con punteggio predefinito 0
// Tieni traccia del processo di registrazione e calcola le statistiche
// Stampa il resoconto delle iscrizioni al torneo
print("Tournament: $tournamentName");
print("Initial Scores: $initialScores");
print("Registration Process:");
// Stampa qui i dettagli del processo di registrazione
print("Final Scores: $playerScores");
print("Tournament Statistics:");
// Stampa qui le statistiche
print("Status: Registration completed successfully");
}Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Manipolazione avanzata delle liste
Proprietà delle liste: primo e ultimoStato della lista: isEmpty e isNotEmpInvertire una listaAggiungere a una lista: insertRimozione dalla lista: removeWhereRicerca in una lista: indexOfOrdinare una listaMescolare una listaRiepilogo - Organizzatore di liste4Manipolazione avanzata delle mappe
Iterare su una mappaVerificare chiavi e valoriProprietà delle mappe: chiavi e valoriAggiunta condizionale: putIfAbsentRimuovere elementi da una mappaMappe annidateRiepilogo - Aggiornamento dell'inventario2Operazioni funzionali sulle liste
Trasformare con 'map'Filtrare con 'where'Usare '.toList()'Verificare condizioni con 'any'Condizioni con 'every'Trovare con 'firstWhere'Riepilogo - Filtraggio dei dati3Insiemi
Che cos'è un insieme?Creare un insiemeAggiungere e rimuovere elementi dagli insiemiVerificare la presenza di elementi in un insiemeConvertire una lista in un insiemeUnione di insiemiIntersezione di insiemiDifferenza tra insiemiRiepilogo - Lista degli ospiti uniciEsercitati da solo: Compilatore Dart online