Menu
Coddy logo textTech

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.

challenge icon

Défi

Facile

Cré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 :

  1. Lire une chaîne de caractères en entrée représentant le nom du tournoi
  2. 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")
  3. 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")
  4. Créer une Map pour stocker les noms des joueurs comme clés et leurs scores comme valeurs
  5. 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
  6. 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 successfully

Si 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 successfully

Si 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 successfully

Votre 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");
}
quiz iconTestez-vous

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