Dodawanie warunkowe: putIfAbsent
Część sekcji Logika i przepływ sterowania ścieżki Dart w Coddy. Lekcja 29 z 65.
Czasami trzeba dodać parę klucz-wartość do Map, ale tylko wtedy, gdy ten klucz jeszcze nie istnieje. Metoda putIfAbsent() doskonale sprawdza się w tej sytuacji, dodając wpis tylko wtedy, gdy brakuje klucza w mapie.
Ta metoda przyjmuje dwa parametry: klucz do sprawdzenia oraz wartość do dodania, jeśli klucz nie istnieje. Jeśli klucz już istnieje, putIfAbsent() nic nie robi i pozostawia istniejącą wartość bez zmian. Jeśli klucza brakuje, dodaje do mapy nową parę klucz-wartość.
Map<String, int> gameScores = {
'Alice': 150,
'Bob': 200
};
// To doda Charlie, ponieważ nie ma go w mapie
gameScores.putIfAbsent('Charlie', () => 0);
print(gameScores); // {Alice: 150, Bob: 200, Charlie: 0}
// To nie zmieni wyniku Alice, ponieważ jest już w mapie
gameScores.putIfAbsent('Alice', () => 0);
print(gameScores); // {Alice: 150, Bob: 200, Charlie: 0}Metoda putIfAbsent() jest szczególnie przydatna do inicjowania wartości domyślnych, na przykład podczas konfigurowania nowych kont użytkowników lub upewniania się, że określone klucze istnieją przed wykonaniem na nich operacji. To bezpieczny sposób dodawania danych bez przypadkowego nadpisywania istniejących informacji.
Wyzwanie
ŁatwyUtwórz program zarządzający systemem rejestracji do turnieju gier, który śledzi wyniki graczy i zapewnia wszystkim graczom domyślne wartości początkowe. Twój program powinien:
- Odczytać dane wejściowe typu string reprezentujące nazwę turnieju
- Odczytać wiele par danych wejściowych reprezentujących imiona graczy i ich aktualne wyniki (dane wejściowe zakończą się po otrzymaniu
"scores_done") - Odczytać wiele danych wejściowych typu string reprezentujących nowych graczy, którzy chcą dołączyć do turnieju (dane wejściowe zakończą się po otrzymaniu
"players_done") - Utworzyć Mapę do przechowywania imion graczy jako kluczy i ich wyników jako wartości
- Użyć metody
putIfAbsent(), aby dodać każdego nowego gracza z domyślnym wynikiem 0, ale tylko wtedy, gdy nie jest jeszcze zarejestrowany - Obliczyć statystyki turnieju i wyświetlić raport rejestracji w dokładnie takim formacie, jak pokazano poniżej
Na przykład, jeśli nazwa turnieju to "Spring Championship", istniejące wyniki obejmują "Alice" z wynikiem 150, "Bob" z wynikiem 200, "Charlie" z wynikiem 75, a nowymi graczami są "Diana", "Alice", "Eve", program powinien wyświetlić:
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 successfullyJeśli nazwa turnieju to "Winter Cup", istniejące wyniki obejmują "John" z wynikiem 300, "Mary" z wynikiem 250, a nowymi graczami są "Sarah", "Tom", "John", program powinien wyświetlić:
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 successfullyJeśli nazwa turnieju to "Summer League", istniejące wyniki obejmują "Alex" z wynikiem 180, "Jordan" z wynikiem 220, "Taylor" z wynikiem 160, "Morgan" z wynikiem 190, a nowymi graczami są "Casey", "Riley", program powinien wyświetlić:
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 successfullyTwój program musi używać metody putIfAbsent(), aby dodawać nowych graczy z domyślnym wynikiem 0, zapewniając, że obecni gracze zachowają swoje aktualne wyniki. Oblicz średni wynik, dzieląc sumę wszystkich wyników przez liczbę graczy. Policz, ilu graczy ma wyniki powyżej 0 i ilu nowych graczy faktycznie dodano (z wyłączeniem tych, którzy byli już zarejestrowani). Format danych wejściowych będzie następujący: nazwa turnieju, następnie naprzemiennie imiona graczy i wyniki (jako ciągi znaków, które należy przekonwertować na liczby całkowite), zakończone przez "scores_done", a potem imiona nowych graczy zakończone przez "players_done".
Spróbuj swoich sił
import 'dart:io';
void main() {
// Wczytaj nazwę turnieju
String? tournamentName = stdin.readLineSync();
// Utwórz mapę do przechowywania wyników graczy
Map<String, int> playerScores = {};
// Wczytaj wyniki istniejących graczy
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;
}
// Zapisz początkowe wyniki do wyświetlenia
Map<String, int> initialScores = Map.from(playerScores);
// Wczytaj nowych graczy do zarejestrowania
List<String> newPlayers = [];
while (true) {
String? input = stdin.readLineSync();
if (input == "players_done") break;
newPlayers.add(input!);
}
// TODO: Napisz swój kod poniżej
// Użyj metody putIfAbsent(), aby dodać nowych graczy z domyślnym wynikiem 0
// Śledź proces rejestracji i oblicz statystyki
// Wyświetl raport z rejestracji do turnieju
print("Tournament: $tournamentName");
print("Initial Scores: $initialScores");
print("Registration Process:");
// Wyświetl tutaj szczegóły procesu rejestracji
print("Final Scores: $playerScores");
print("Tournament Statistics:");
// Wyświetl tutaj statystyki
print("Status: Registration completed successfully");
}Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Logika i przepływ sterowania
1Zaawansowana manipulacja listami
Właściwości listy: first i lastStan listy: isEmpty i isNotEmpOdwracanie listyDodawanie do listy: insertUsuwanie z listy: removeWhereWyszukiwanie na liście: indexOfSortowanie listyMieszanie elementów listyPodsumowanie – Organizator listy4Zaawansowane operacje na mapach
Iterowanie po mapieSprawdzanie kluczy i wartościWłaściwości mapy: klucze i wartościDodawanie warunkowe: putIfAbsentUsuwanie wpisów z mapyZagnieżdżone mapyPodsumowanie – aktualizacja stanu magazynowego2Operacje funkcyjne na listach
Przekształcanie za pomocą 'map'Filtrowanie za pomocą 'where'Używanie '.toList()'Sprawdzanie warunków za pomocą 'any'Warunki z użyciem 'every'Wyszukiwanie za pomocą 'firstWhere'Podsumowanie — filtrowanie danych5Projekt: Kalkulator koszyka zakupowego
Konfiguracja projektuDodawanie produktów do koszyka3Zbiory
Czym jest zbiór?Tworzenie zbioruDodawanie i usuwanie elementów ze zbiorówSprawdzanie, czy element znajduje się w zbiorzeKonwersja listy na zbiórSuma zbiorówCzęść wspólna zbiorówRóżnica zbiorówPodsumowanie — unikalna lista gościPoćwicz samodzielnie: Kompilator Dart online