Menu
Coddy logo textTech

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.

challenge icon

Wyzwanie

Łatwy

Utwó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:

  1. Odczytać dane wejściowe typu string reprezentujące nazwę turnieju
  2. Odczytać wiele par danych wejściowych reprezentujących imiona graczy i ich aktualne wyniki (dane wejściowe zakończą się po otrzymaniu "scores_done")
  3. 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")
  4. Utworzyć Mapę do przechowywania imion graczy jako kluczy i ich wyników jako wartości
  5. Użyć metody putIfAbsent(), aby dodać każdego nowego gracza z domyślnym wynikiem 0, ale tylko wtedy, gdy nie jest jeszcze zarejestrowany
  6. 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 successfully

Jeś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 successfully

Jeś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 successfully

Twó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");
}
quiz iconSprawdź się

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

Poćwicz samodzielnie: Kompilator Dart online