Menu
Coddy logo textTech

Bedingtes Hinzufügen: putIfAbsent

Teil des Abschnitts Logik & Ablauf der Dart-Journey von Coddy — Lektion 29 von 65.

Manchmal müssen Sie ein Schlüssel-Wert-Paar zu einer Map hinzufügen, aber nur, wenn dieser Schlüssel noch nicht existiert. Die Methode putIfAbsent() bewältigt diese Situation perfekt, indem sie den Eintrag nur dann hinzufügt, wenn der Schlüssel in der Map fehlt.

Diese Methode nimmt zwei Parameter entgegen: den Schlüssel, nach dem gesucht werden soll, und den Wert, der hinzugefügt werden soll, falls der Schlüssel nicht vorhanden ist. Wenn der Schlüssel bereits existiert, macht putIfAbsent() nichts und lässt den vorhandenen Wert unverändert. Wenn der Schlüssel fehlt, fügt sie das neue Schlüssel-Wert-Paar zur Map hinzu.

Map<String, int> gameScores = {
  'Alice': 150,
  'Bob': 200
};

// Dies fügt Charlie hinzu, da er noch nicht in der Map enthalten ist
gameScores.putIfAbsent('Charlie', () => 0);
print(gameScores);  // {Alice: 150, Bob: 200, Charlie: 0}

// Dies wird Alices Punktzahl nicht ändern, da sie bereits existiert
gameScores.putIfAbsent('Alice', () => 0);
print(gameScores);  // {Alice: 150, Bob: 200, Charlie: 0}

Die Methode putIfAbsent() ist besonders nützlich für die Initialisierung von Standardwerten, wie zum Beispiel beim Einrichten neuer Benutzerkonten oder um sicherzustellen, dass bestimmte Schlüssel existieren, bevor Operationen an ihnen durchgeführt werden. Es ist ein sicherer Weg, Daten hinzuzufügen, ohne versehentlich vorhandene Informationen zu überschreiben.

challenge icon

Aufgabe

Einfach

Erstellen Sie ein Programm, das ein Registrierungssystem für ein Gaming-Turnier verwaltet, indem es die Spielstände der Spieler verfolgt und sicherstellt, dass alle Spieler Standard-Startwerte haben. Ihr Programm sollte:

  1. Einen String-Input einlesen, der den Turniernamen darstellt
  2. Mehrere Paare von Eingaben einlesen, die Spielernamen und deren aktuelle Spielstände darstellen (die Eingabe endet, wenn Sie "scores_done" erhalten)
  3. Mehrere String-Inputs einlesen, die neue Spieler darstellen, die dem Turnier beitreten möchten (die Eingabe endet, wenn Sie "players_done" erhalten)
  4. Eine Map erstellen, um Spielernamen als Schlüssel und deren Spielstände als Werte zu speichern
  5. Die Methode putIfAbsent() verwenden, um jeden neuen Spieler mit einem Standard-Spielstand von 0 hinzuzufügen, aber nur, wenn dieser noch nicht registriert ist
  6. Turnierstatistiken berechnen und den Registrierungsbericht im exakt unten gezeigten Format ausgeben

Wenn der Turniername beispielsweise "Spring Championship" ist, die vorhandenen Spielstände "Alice" mit 150, "Bob" mit 200, "Charlie" mit 75 umfassen und die neuen Spieler "Diana", "Alice", "Eve" sind, sollte Ihr Programm Folgendes ausgeben:

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

Wenn der Turniername "Winter Cup" ist, die vorhandenen Spielstände "John" mit 300, "Mary" mit 250 umfassen und die neuen Spieler "Sarah", "Tom", "John" sind, sollte Ihr Programm Folgendes ausgeben:

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

Wenn der Turniername "Summer League" ist, die vorhandenen Spielstände "Alex" mit 180, "Jordan" mit 220, "Taylor" mit 160, "Morgan" mit 190 umfassen und die neuen Spieler "Casey", "Riley" sind, sollte Ihr Programm Folgendes ausgeben:

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

Ihr Programm muss die Methode putIfAbsent() verwenden, um neue Spieler mit einem Standard-Spielstand von 0 hinzuzufügen, wobei sichergestellt werden muss, dass bestehende Spieler ihre aktuellen Spielstände unverändert behalten. Berechnen Sie den Durchschnittswert, indem Sie die Summe aller Spielstände durch die Anzahl der Spieler teilen. Zählen Sie, wie viele Spieler Spielstände über 0 haben und wie viele neue Spieler tatsächlich hinzugefügt wurden (ausgenommen diejenigen, die bereits registriert waren). Das Eingabeformat ist: Turniername, dann abwechselnd Spielernamen und Spielstände (als Strings, die in Ganzzahlen umgewandelt werden müssen), endend mit "scores_done", gefolgt von neuen Spielernamen, endend mit "players_done".

Spickzettel

Die putIfAbsent() Methode fügt einem Map ein Schlüssel-Wert-Paar hinzu, jedoch nur, wenn der Schlüssel noch nicht existiert:

Map<String, int> gameScores = {
  'Alice': 150,
  'Bob': 200
};

// Fügt Charlie hinzu, da er nicht in der Map ist
gameScores.putIfAbsent('Charlie', () => 0);

// Ändert Alices Punktestand nicht, da sie bereits existiert
gameScores.putIfAbsent('Alice', () => 0);

Diese Methode ist nützlich, um Standardwerte zu initialisieren, ohne vorhandene Daten zu überschreiben.

Probier es selbst

import 'dart:io';

void main() {
  // Turniernamen lesen
  String? tournamentName = stdin.readLineSync();
  
  // Eine Map erstellen, um Spieler-Scores zu speichern
  Map<String, int> playerScores = {};
  
  // Bestehende Spieler-Scores lesen
  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;
  }
  
  // Ursprüngliche Scores für die Anzeige speichern
  Map<String, int> initialScores = Map.from(playerScores);
  
  // Neue zu registrierende Spieler lesen
  List<String> newPlayers = [];
  while (true) {
    String? input = stdin.readLineSync();
    if (input == "players_done") break;
    newPlayers.add(input!);
  }
  
  // TODO: Schreiben Sie Ihren Code unten
  // Verwenden Sie die Methode putIfAbsent(), um neue Spieler mit dem Standard-Score 0 hinzuzufügen
  // Verfolgen Sie den Registrierungsprozess und berechnen Sie Statistiken
  
  // Den Turnier-Registrierungsbericht ausgeben
  print("Tournament: $tournamentName");
  print("Initial Scores: $initialScores");
  print("Registration Process:");
  // Registrierungsprozess-Details hier ausgeben
  print("Final Scores: $playerScores");
  print("Tournament Statistics:");
  // Statistiken hier ausgeben
  print("Status: Registration completed successfully");
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Logik & Ablauf