Ajout conditionnel : putIfAbsent
Fait partie de la section Logique & Flux du Journey Dart de Coddy — leçon 29 sur 65.
Parfois, vous devez ajouter une paire clé-valeur à une Map, mais seulement si cette clé n'existe pas déjà. La méthode putIfAbsent() gère parfaitement cette situation en ajoutant l'entrée uniquement lorsque la clé est absente de la map.
Cette méthode prend deux paramètres : la clé à vérifier et la valeur à ajouter si la clé est absente. Si la clé existe déjà, putIfAbsent() ne fait rien et laisse la valeur existante inchangée. Si la clé est absente, elle ajoute la nouvelle paire clé-valeur à la map.
Map<String, int> gameScores = {
'Alice': 150,
'Bob': 200
};
// Ceci ajoutera Charlie puisqu'il n'est pas dans la map
gameScores.putIfAbsent('Charlie', () => 0);
print(gameScores); // {Alice: 150, Bob: 200, Charlie: 0}
// Cela ne changera pas le score d'Alice puisqu'elle existe déjà
gameScores.putIfAbsent('Alice', () => 0);
print(gameScores); // {Alice: 150, Bob: 200, Charlie: 0}La méthode putIfAbsent() est particulièrement utile pour initialiser des valeurs par défaut, comme la configuration de nouveaux comptes d'utilisateurs ou l'assurance que certaines clés existent avant d'effectuer des opérations sur celles-ci. C'est un moyen sûr d'ajouter des données sans écraser accidentellement les informations existantes.
Défi
FacileCréez un programme qui gère un système d'inscription à un tournoi de jeu en suivant les scores des joueurs et en s'assurant que tous les joueurs ont des valeurs de départ par défaut. Votre programme doit :
- Lire une chaîne de caractères en entrée représentant le nom du tournoi
- Lire plusieurs paires d'entrées représentant les noms des joueurs et leurs scores actuels (l'entrée se terminera lorsque vous recevrez
"scores_done") - Lire plusieurs chaînes de caractères en entrée représentant les nouveaux joueurs qui souhaitent rejoindre le tournoi (l'entrée se terminera lorsque vous recevrez
"players_done") - Créer une Map pour stocker les noms des joueurs comme clés et leurs scores comme valeurs
- Utiliser la méthode
putIfAbsent()pour ajouter chaque nouveau joueur avec un score par défaut de 0, mais seulement s'ils ne sont pas déjà inscrits - Calculer les statistiques du tournoi et afficher le rapport d'inscription exactement au format indiqué ci-dessous
Par exemple, si le nom du tournoi est "Spring Championship", que les scores existants incluent "Alice" avec 150, "Bob" avec 200, "Charlie" avec 75, et que les nouveaux joueurs sont "Diana", "Alice", "Eve", votre programme doit afficher :
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 le nom du tournoi est "Winter Cup", que les scores existants incluent "John" avec 300, "Mary" avec 250, et que les nouveaux joueurs sont "Sarah", "Tom", "John", votre programme doit afficher :
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 le nom du tournoi est "Summer League", que les scores existants incluent "Alex" avec 180, "Jordan" avec 220, "Taylor" avec 160, "Morgan" avec 190, et que les nouveaux joueurs sont "Casey", "Riley", votre programme doit afficher :
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 successfullyVotre programme doit utiliser la méthode putIfAbsent() pour ajouter de nouveaux joueurs avec un score par défaut de 0, en veillant à ce que les joueurs existants conservent leurs scores actuels inchangés. Calculez le score moyen en divisant le total de tous les scores par le nombre de joueurs. Comptez combien de joueurs ont des scores supérieurs à 0 et combien de nouveaux joueurs ont été réellement ajoutés (en excluant ceux qui étaient déjà inscrits). Le format d'entrée sera : le nom du tournoi, puis alternativement les noms des joueurs et les scores (sous forme de chaînes de caractères qui doivent être converties en entiers), se terminant par "scores_done", suivi des noms des nouveaux joueurs se terminant par "players_done".
Aide-mémoire
La méthode putIfAbsent() ajoute une paire clé-valeur à une Map uniquement si la clé n'existe pas déjà :
Map<String, int> gameScores = {
'Alice': 150,
'Bob': 200
};
// Adds Charlie since he's not in the map
gameScores.putIfAbsent('Charlie', () => 0);
// Won't change Alice's score since she already exists
gameScores.putIfAbsent('Alice', () => 0);Cette méthode est utile pour initialiser des valeurs par défaut sans écraser les données existantes.
Essayez vous-même
import 'dart:io';
void main() {
// Lire le nom du tournoi
String? tournamentName = stdin.readLineSync();
// Créer une map pour stocker les scores des joueurs
Map<String, int> playerScores = {};
// Lire les scores des joueurs existants
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;
}
// Stocker les scores initiaux pour l'affichage
Map<String, int> initialScores = Map.from(playerScores);
// Lire les nouveaux joueurs à inscrire
List<String> newPlayers = [];
while (true) {
String? input = stdin.readLineSync();
if (input == "players_done") break;
newPlayers.add(input!);
}
// TODO: Écrivez votre code ci-dessous
// Utilisez la méthode putIfAbsent() pour ajouter de nouveaux joueurs avec un score par défaut de 0
// Suivre le processus d'inscription et calculer les statistiques
// Imprimer le rapport d'inscription au tournoi
print("Tournament: $tournamentName");
print("Initial Scores: $initialScores");
print("Registration Process:");
// Imprimer les détails du processus d'inscription ici
print("Final Scores: $playerScores");
print("Tournament Statistics:");
// Imprimer les statistiques ici
print("Status: Registration completed successfully");
}Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logique & Flux
1Manipulation avancée des listes
Propriétés de liste : first & lastÉtat de la liste : isEmpty & isNotEmptyInverser une listeAjouter à une liste : insertSuppression dans une liste : removeWhereRechercher dans une liste : indexOfTrier une listeMélanger une listeRécapitulatif - Organisateur de liste4Manipulation avancée des Maps
Itérer sur une MapVérifier les clés et les valeursPropriétés de Map : keys & valuesAjout conditionnel : putIfAbsentSupprimer des entrées d'une MapMaps imbriquéesRécapitulatif - Mise à jour de l'inventaire2Opérations fonctionnelles sur les listes
Transformer avec 'map'Filtrer avec 'where'Utiliser '.toList()'Vérifier des conditions avec 'any'Conditions avec 'every'Trouver avec 'firstWhere'Récapitulatif - Filtrage de données3Les Ensembles
Qu'est-ce qu'un ensemble ?Créer un ensembleAjouter et supprimer des éléments d'un ensembleVérifier la présence d'éléments dans un ensembleConvertir une liste en ensembleUnion d'ensemblesIntersection d'ensemblesDifférence d'ensemblesRécapitulatif - Liste d'invités uniques