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
EinfachErstelle ein Programm, das ein Anmeldesystem für ein Gaming-Turnier verwaltet, indem es die Punktzahlen der Spieler verfolgt und sicherstellt, dass alle Spieler Standardanfangswerte haben. Dein Programm sollte:
- Eine String-Eingabe lesen, die den Namen des Turniers darstellt
- Mehrere Eingabepaare lesen, die aus Spielernamen und ihren aktuellen Punktzahlen bestehen (die Eingabe endet, sobald du
"scores_done"erhältst) - Mehrere String-Eingaben lesen, die neue Spieler darstellen, die dem Turnier beitreten möchten (die Eingabe endet, sobald du
"players_done"erhältst) - Eine Map erstellen, um Spielernamen als Schlüssel und ihre Punktzahlen als Werte zu speichern
- Die Methode
putIfAbsent()verwenden, um jeden neuen Spieler mit einer Standardpunktzahl von 0 hinzuzufügen, aber nur, wenn er noch nicht registriert ist - Die Turnierstatistiken berechnen und den Anmeldebericht exakt im unten gezeigten Format ausgeben
Wenn der Turniername beispielsweise "Spring Championship" lautet, die vorhandenen Punktzahlen "Alice" mit 150, "Bob" mit 200, "Charlie" mit 75 umfassen und die neuen Spieler "Diana", "Alice", "Eve" sind, sollte dein 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" lautet, die vorhandenen Punktzahlen "John" mit 300 und "Mary" mit 250 umfassen und die neuen Spieler "Sarah", "Tom", "John" sind, sollte dein 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" lautet, die vorhandenen Punktzahlen "Alex" mit 180, "Jordan" mit 220, "Taylor" mit 160, "Morgan" mit 190 umfassen und die neuen Spieler "Casey", "Riley" sind, sollte dein 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 successfullyDein Programm muss die Methode putIfAbsent() verwenden, um neue Spieler mit einer Standardpunktzahl von 0 hinzuzufügen und dabei sicherzustellen, dass bestehende Spieler ihre aktuellen Punktzahlen unverändert behalten. Berechne die durchschnittliche Punktzahl, indem du die Summe aller Punktzahlen durch die Anzahl der Spieler teilst. Zähle, wie viele Spieler Punktzahlen über 0 haben und wie viele neue Spieler tatsächlich hinzugefügt wurden (ausgenommen diejenigen, die bereits registriert waren). Das Eingabeformat lautet: Turniername, danach abwechselnd Spielernamen und Punktzahlen (als Strings, die in Ganzzahlen umgewandelt werden müssen), endend mit "scores_done", gefolgt von neuen Spielernamen, endend mit "players_done".
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Übe selbstständig: Online-Dart-Compiler