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.
Aufgabe
EinfachErstellen 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:
- Einen String-Input einlesen, der den Turniernamen darstellt
- Mehrere Paare von Eingaben einlesen, die Spielernamen und deren aktuelle Spielstände darstellen (die Eingabe endet, wenn Sie
"scores_done"erhalten) - Mehrere String-Inputs einlesen, die neue Spieler darstellen, die dem Turnier beitreten möchten (die Eingabe endet, wenn Sie
"players_done"erhalten) - Eine Map erstellen, um Spielernamen als Schlüssel und deren Spielstände als Werte zu speichern
- Die Methode
putIfAbsent()verwenden, um jeden neuen Spieler mit einem Standard-Spielstand von 0 hinzuzufügen, aber nur, wenn dieser noch nicht registriert ist - 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 successfullyWenn 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 successfullyWenn 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 successfullyIhr 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");
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Ablauf
1Fortgeschrittene Listenmanipulation
Listen-Eigenschaften: first & lastListen-Status: isEmpty & isNotEmptyEine Liste umkehrenHinzufügen zu einer Liste: insertElemente aus Liste entfernen: removeWhereSuchen in einer Liste: indexOfEine Liste sortierenEine Liste mischenZusammenfassung – Listen-Organizer4Fortgeschrittene Map-Manipulation
Über eine Map iterierenPrüfen auf Schlüssel und WerteMap-Eigenschaften: keys & valuesBedingtes Hinzufügen: putIfAbsentEinträge aus einer Map entfernenVerschachtelte MapsRückblick – Inventar-Update7Fortgeschrittene Funktionen
Anonyme FunktionenFunktionen als Argumente übergebenClosures verstehenEinführung in die RekursionRekursive Funktion: CountdownRekursive Funktion: FakultätZusammenfassung – List Processor10Abschluss-Herausforderungen
Herausforderung: NotensortiererHerausforderung: VokalzählerHerausforderung: FizzBuzz2Funktionale Listenoperationen
Transformieren mit 'map'Filtern mit 'where''.toList()' verwendenBedingungen prüfen mit 'any'Bedingungen mit 'every'Suchen mit 'firstWhere'Zusammenfassung – Datenfilterung3Sets
Was ist ein Set?Ein Set erstellenHinzufügen und Entfernen in SetsPrüfen auf Elemente in einem SetEine Liste in ein Set umwandelnSet-VereinigungSet-SchnittmengeSet-DifferenzRückblick – Einzigartige Gästeliste