Menu
Coddy logo textTech

Koşullu Ekleme: putIfAbsent

Coddy'nin Dart Journey'sinin Mantık & Akış bölümünün bir parçası — ders 29 / 65.

Bazen bir Map yapısına bir anahtar-değer çifti eklemeniz gerekir, ancak bu yalnızca o anahtar zaten mevcut değilse yapılmalıdır. putIfAbsent() yöntemi, girişi yalnızca anahtar haritada eksik olduğunda ekleyerek bu durumu mükemmel bir şekilde yönetir.

Bu yöntem iki parametre alır: kontrol edilecek anahtar ve anahtar mevcut değilse eklenecek değer. Eğer anahtar zaten mevcutsa, putIfAbsent() hiçbir şey yapmaz ve mevcut değeri değiştirmeden bırakır. Eğer anahtar eksikse, yeni anahtar-değer çiftini haritaya ekler.

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

// Charlie haritada bulunmadığı için onu ekleyecektir
gameScores.putIfAbsent('Charlie', () => 0);
print(gameScores);  // {Alice: 150, Bob: 200, Charlie: 0}

// Alice zaten mevcut olduğu için puanını değiştirmeyecektir
gameScores.putIfAbsent('Alice', () => 0);
print(gameScores);  // {Alice: 150, Bob: 200, Charlie: 0}

putIfAbsent() yöntemi, yeni kullanıcı hesapları oluşturmak veya üzerlerinde işlem yapmadan önce belirli anahtarların mevcut olduğundan emin olmak gibi varsayılan değerleri başlatmak için özellikle yararlıdır. Mevcut bilgilerin yanlışlıkla üzerine yazılmadan veri eklemenin güvenli bir yoludur.

challenge icon

Görev

Kolay

Oyuncu puanlarını takip ederek ve tüm oyuncuların varsayılan başlangıç değerlerine sahip olmasını sağlayarak bir oyun turnuvası kayıt sistemini yöneten bir program oluşturun. Programınız şunları yapmalıdır:

  1. Turnuva adını temsil eden bir dize (string) girdisi okuyun
  2. Oyuncu adlarını ve mevcut puanlarını temsil eden birden fazla girdi çifti okuyun (girdi "scores_done" değerini aldığınızda sona erecektir)
  3. Turnuvaya katılmak isteyen yeni oyuncuları temsil eden birden fazla dize girdisi okuyun (girdi "players_done" değerini aldığınızda sona erecektir)
  4. Oyuncu adlarını anahtar (key), puanlarını ise değer (value) olarak saklamak için bir Map oluşturun
  5. Her yeni oyuncuyu, yalnızca halihazırda kayıtlı değillerse, varsayılan 0 puanıyla eklemek için putIfAbsent() metodunu kullanın
  6. Turnuva istatistiklerini hesaplayın ve kayıt raporunu tam olarak aşağıda gösterilen formatta yazdırın

Örneğin, turnuva adı "Spring Championship" ise, mevcut puanlar 150 ile "Alice", 200 ile "Bob", 75 ile "Charlie" içeriyorsa ve yeni oyuncular "Diana", "Alice", "Eve" ise, programınız şu çıktıyı vermelidir:

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

Eğer turnuva adı "Winter Cup" ise, mevcut puanlar 300 ile "John", 250 ile "Mary" içeriyorsa ve yeni oyuncular "Sarah", "Tom", "John" ise, programınız şu çıktıyı vermelidir:

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

Eğer turnuva adı "Summer League" ise, mevcut puanlar 180 ile "Alex", 220 ile "Jordan", 160 ile "Taylor", 190 ile "Morgan" içeriyorsa ve yeni oyuncular "Casey", "Riley" ise, programınız şu çıktıyı vermelidir:

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

Programınız, yeni oyuncuları varsayılan 0 puanıyla eklemek için putIfAbsent() metodunu kullanmalı ve mevcut oyuncuların mevcut puanlarının değişmeden kalmasını sağlamalıdır. Ortalama puanı, tüm puanların toplamını oyuncu sayısına bölerek hesaplayın. Kaç oyuncunun 0'ın üzerinde puana sahip olduğunu ve gerçekte kaç yeni oyuncunun eklendiğini (halihazırda kayıtlı olanlar hariç) sayın. Girdi formatı şu şekilde olacaktır: turnuva adı, ardından dönüşümlü olarak oyuncu adları ve puanları (tam sayıya dönüştürülmesi gereken dizeler olarak), "scores_done" ile biter, ardından "players_done" ile biten yeni oyuncu adları gelir.

Kopya kağıdı

putIfAbsent() yöntemi, bir Map'e yalnızca anahtar zaten mevcut değilse bir anahtar-değer çifti ekler:

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

// Haritada olmadığı için Charlie'yi ekler
gameScores.putIfAbsent('Charlie', () => 0);

// Alice zaten mevcut olduğu için puanını değiştirmez
gameScores.putIfAbsent('Alice', () => 0);

Bu yöntem, mevcut verilerin üzerine yazmadan varsayılan değerleri başlatmak için kullanışlıdır.

Kendin dene

import 'dart:io';

void main() {
  // Turnuva adını oku
  String? tournamentName = stdin.readLineSync();
  
  // Oyuncu puanlarını saklamak için bir map oluştur
  Map<String, int> playerScores = {};
  
  // Mevcut oyuncu puanlarını oku
  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;
  }
  
  // Görüntüleme için başlangıç puanlarını sakla
  Map<String, int> initialScores = Map.from(playerScores);
  
  // Kaydedilecek yeni oyuncuları oku
  List<String> newPlayers = [];
  while (true) {
    String? input = stdin.readLineSync();
    if (input == "players_done") break;
    newPlayers.add(input!);
  }
  
  // TODO: Kodunuzu aşağıya yazın
  // Yeni oyuncuları varsayılan 0 puanıyla eklemek için putIfAbsent() metodunu kullanın
  // Kayıt sürecini takip edin ve istatistikleri hesaplayın
  
  // Turnuva kayıt raporunu yazdır
  print("Tournament: $tournamentName");
  print("Initial Scores: $initialScores");
  print("Registration Process:");
  // Kayıt süreci detaylarını buraya yazdırın
  print("Final Scores: $playerScores");
  print("Tournament Statistics:");
  // İstatistikleri buraya yazdırın
  print("Status: Registration completed successfully");
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Mantık & Akış bölümündeki tüm dersler