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.
Görev
KolayOyuncu 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:
- Turnuva adını temsil eden bir dize (string) girdisi okuyun
- Oyuncu adlarını ve mevcut puanlarını temsil eden birden fazla girdi çifti okuyun (girdi
"scores_done"değerini aldığınızda sona erecektir) - Turnuvaya katılmak isteyen yeni oyuncuları temsil eden birden fazla dize girdisi okuyun (girdi
"players_done"değerini aldığınızda sona erecektir) - Oyuncu adlarını anahtar (key), puanlarını ise değer (value) olarak saklamak için bir Map oluşturun
- Her yeni oyuncuyu, yalnızca halihazırda kayıtlı değillerse, varsayılan 0 puanıyla eklemek için
putIfAbsent()metodunu kullanın - 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 successfullyEğ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 successfullyEğ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 successfullyProgramı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");
}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
1İleri Düzey Liste İşlemleri
Liste Özellikleri: first & lastListe Durumu: isEmpty & isNotEmptyBir Listeyi Tersine ÇevirmeListeye Ekleme: insertListeden Silme: removeWhereListede Bulma: indexOfBir Listeyi SıralamaBir Listeyi KarıştırmaÖzet - Liste Düzenleyici4İleri Seviye Map İşlemleri
Map Üzerinde GezinmeAnahtar ve Değer KontrolüMap Özellikleri: keys & valuesKoşullu Ekleme: putIfAbsentMap'ten Öge Kaldırmaİç İçe Map'lerÖzet - Envanter Güncelleme7İleri Seviye Fonksiyonlar
Anonim FonksiyonlarFonksiyonları Argüman Olarak AktarmaClosure'ları AnlamakÖzyinelemeye GirişÖzyinelemeli Fonksiyon: Geri SayımÖzyinelemeli Fonksiyon: FaktöriyelÖzet - Liste İşleyici10Son Meydan Okumalar
Meydan Okuma: Not SıralayıcıMeydan Okuma: Sesli Harf SayacıMeydan Okuma: FizzBuzz2Fonksiyonel Liste İşlemleri
'map' ile Dönüştürme'where' ile Filtreleme'.toList()' Kullanımı'any' ile Koşul Kontrolü'every' ile Koşullar'firstWhere' ile BulmaÖzet - Veri Filtreleme5Proje: Alışveriş Sepeti Hesaplayıcı
Proje KurulumuSepete Ürün Ekleme3Kümeler
Küme Nedir?Küme OluşturmaKümelere Eleman Ekleme ve ÇıkarmaKüme İçinde Eleman KontrolüListeyi Kümeye DönüştürmeKüme BirleşimiKüme KesişimiKüme FarkıÖzet - Benzersiz Davetli Listesi