Menu
CoddyTech

Thêm có điều kiện: putIfAbsent

Thuộc phần Logic và luồng điều khiển trong hành trình Dart của Coddy. Bài học 29 trên 65.

Đôi khi bạn cần thêm một cặp khóa-giá trị vào Map, nhưng chỉ khi khóa đó chưa tồn tại. Phương thức putIfAbsent() xử lý hoàn hảo trường hợp này bằng cách chỉ thêm mục đó khi khóa chưa có trong từ điển.

Phương thức này nhận hai tham số: khóa cần kiểm tra và giá trị cần thêm nếu khóa chưa tồn tại. Nếu khóa đã tồn tại, putIfAbsent() sẽ không làm gì và giữ nguyên giá trị hiện có. Nếu thiếu khóa, phương thức sẽ thêm cặp khóa-giá trị mới vào từ điển.

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

// Lệnh này sẽ thêm Charlie vì Charlie chưa có trong map
gameScores.putIfAbsent('Charlie', () => 0);
print(gameScores);  // {Alice: 150, Bob: 200, Charlie: 0}

// Lệnh này sẽ không thay đổi điểm của Alice vì Alice đã có trong map
gameScores.putIfAbsent('Alice', () => 0);
print(gameScores);  // {Alice: 150, Bob: 200, Charlie: 0}

Phương thức putIfAbsent() đặc biệt hữu ích để khởi tạo các giá trị mặc định, chẳng hạn như thiết lập tài khoản người dùng mới hoặc đảm bảo một số khóa nhất định tồn tại trước khi thực hiện thao tác với chúng. Đây là cách an toàn để thêm dữ liệu mà không vô tình ghi đè thông tin hiện có.

challenge icon

Thử thách

Dễ

Tạo một chương trình quản lý hệ thống đăng ký giải đấu trò chơi bằng cách theo dõi điểm số của người chơi và đảm bảo mọi người chơi đều có giá trị mặc định ban đầu. Chương trình của bạn cần:

  1. Đọc một đầu vào dạng chuỗi (string) biểu thị tên giải đấu
  2. Đọc nhiều cặp đầu vào biểu thị tên người chơi và điểm số hiện tại của họ (đầu vào sẽ kết thúc khi bạn nhận được "scores_done")
  3. Đọc nhiều đầu vào dạng chuỗi biểu thị những người chơi mới muốn tham gia giải đấu (đầu vào sẽ kết thúc khi bạn nhận được "players_done")
  4. Tạo một Map để lưu tên người chơi làm khóa và điểm số của họ làm giá trị
  5. Dùng phương thức putIfAbsent() để thêm từng người chơi mới với điểm mặc định là 0, nhưng chỉ khi họ chưa đăng ký
  6. Tính toán thống kê giải đấu và in báo cáo đăng ký theo đúng định dạng bên dưới

Ví dụ, nếu tên giải đấu là "Spring Championship", điểm số hiện có gồm "Alice" với 150, "Bob" với 200, "Charlie" với 75, và những người chơi mới là "Diana", "Alice", "Eve", chương trình của bạn sẽ xuất ra:

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

Nếu tên giải đấu là "Winter Cup", điểm số hiện có gồm "John" với 300, "Mary" với 250, và những người chơi mới là "Sarah", "Tom", "John", chương trình của bạn sẽ xuất ra:

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

Nếu tên giải đấu là "Summer League", điểm số hiện có gồm "Alex" với 180, "Jordan" với 220, "Taylor" với 160, "Morgan" với 190, và những người chơi mới là "Casey", "Riley", chương trình của bạn sẽ xuất ra:

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

Chương trình của bạn phải dùng phương thức putIfAbsent() để thêm người chơi mới với điểm mặc định là 0, đồng thời đảm bảo điểm số hiện tại của những người chơi đã có không thay đổi. Tính điểm trung bình bằng cách chia tổng điểm cho số người chơi. Đếm số người chơi có điểm trên 0 và số người chơi mới thực sự được thêm vào, không tính những người đã đăng ký. Định dạng đầu vào sẽ là: tên giải đấu, sau đó là các cặp tên người chơi và điểm số xen kẽ (dưới dạng chuỗi cần chuyển thành số nguyên), kết thúc bằng "scores_done", rồi đến tên những người chơi mới, kết thúc bằng "players_done".

Tự làm thử

import 'dart:io';

void main() {
  // Đọc tên giải đấu
  String? tournamentName = stdin.readLineSync();
  
  // Tạo một map để lưu điểm của người chơi
  Map<String, int> playerScores = {};
  
  // Đọc điểm hiện có của người chơi
  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;
  }
  
  // Lưu điểm ban đầu để hiển thị
  Map<String, int> initialScores = Map.from(playerScores);
  
  // Đọc danh sách người chơi mới cần đăng ký
  List<String> newPlayers = [];
  while (true) {
    String? input = stdin.readLineSync();
    if (input == "players_done") break;
    newPlayers.add(input!);
  }
  
  // TODO: Viết code của bạn bên dưới
  // Dùng phương thức (method) putIfAbsent() để thêm người chơi mới với điểm mặc định là 0
  // Theo dõi quá trình đăng ký và tính số liệu thống kê
  
  // In ra báo cáo đăng ký giải đấu
  print("Tournament: $tournamentName");
  print("Initial Scores: $initialScores");
  print("Registration Process:");
  // In ra chi tiết quá trình đăng ký tại đây
  print("Final Scores: $playerScores");
  print("Tournament Statistics:");
  // In ra số liệu thống kê tại đây
  print("Status: Registration completed successfully");
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng điều khiển

Tự luyện tập: Trình biên dịch Dart online