Menu
CoddyTech

Cập nhật giá trị

Thuộc phần Logic và luồng chương trình trong hành trình Rust của Coddy. Bài học 32 trên 66.

Đôi khi bạn cần cập nhật giá trị trong một HashMap theo nhiều cách khác nhau. Bạn đã biết rằng .insert() sẽ ghi đè giá trị hiện có, nhưng nếu bạn chỉ muốn thêm giá trị khi khóa chưa tồn tại thì sao?

Rust cung cấp API .entry() để cập nhật giá trị linh hoạt hơn. Phương thức hữu ích nhất trong API này là .or_insert(), phương thức chỉ thêm giá trị nếu khóa chưa tồn tại:

let mut scores = HashMap::new();
scores.insert("Alice", 85);

// Lệnh này KHÔNG ghi đè điểm của Alice
scores.entry("Alice").or_insert(90);

// Lệnh này SẼ thêm điểm của Bob vì Bob chưa có trong HashMap
scores.entry("Bob").or_insert(90);

Phương thức .entry() trả về một enum Entry, biểu thị vị trí đã có dữ liệu hoặc còn trống trong từ điển băm. Khi bạn gọi .or_insert() trên đó, nó chỉ thêm giá trị mới nếu mục đó còn trống (khóa chưa tồn tại).

challenge icon

Thử thách

Dễ

Bạn sẽ nhận một số nguyên n cho biết số tên người chơi cần xử lý. Sau đó, bạn sẽ nhận n tên người chơi làm đầu vào. Tạo một bản đồ băm để theo dõi điểm số của người chơi (kiểu HashMap<String, i32>). Với mỗi tên người chơi nhận được, hãy dùng .entry() cùng với .or_insert() để thêm tên đó vào bản đồ với điểm ban đầu là 100, chỉ khi tên đó chưa tồn tại. Sau khi xử lý tất cả tên, hãy in tên từng người chơi cùng điểm số của họ.

Yêu cầu:

  • Nhập HashMap từ std::collections
  • Tạo một bản đồ băm có thể thay đổi với kiểu HashMap<String, i32>
  • Đọc đầu vào đầu tiên và chuyển thành i32 để lấy số tên người chơi
  • Dùng một vòng lặp để đọc n tên người chơi
  • Với mỗi tên người chơi, dùng .entry(name).or_insert(100) để thêm tên đó cùng điểm số 100 nếu tên đó chưa có trong bản đồ
  • Sau khi xử lý tất cả tên, duyệt qua bản đồ băm và in thông tin của từng người chơi theo định dạng: [name]: [score]

Đầu vào:

  • Dòng đầu tiên: Một số nguyên n (ví dụ: 5)
  • n dòng tiếp theo: Tên người chơi (ví dụ: Alice, Bob, Alice, Charlie, Bob)

Đầu ra:

  • Mỗi người chơi duy nhất được in trên một dòng theo định dạng: [name]: [score]
  • Thứ tự các dòng đầu ra có thể thay đổi giữa các lần chạy test

Tự làm thử

use std::collections::HashMap;
use std::io::{self, BufRead};

fn main() {
    let stdin = io::stdin();
    let mut lines = stdin.lock().lines();
    
    // Đọc số lượng tên người chơi
    let n: i32 = lines.next().unwrap().unwrap().trim().parse().unwrap();
    
    // Tạo HashMap có thể thay đổi để lưu điểm của người chơi
    let mut player_scores: HashMap<String, i32> = HashMap::new();
    
    // TODO: Viết code của bạn bên dưới
    // Đọc n tên người chơi và dùng .entry().or_insert(100) để thêm họ vào HashMap
    
    
    
    // In ra từng người chơi và điểm của họ theo định dạng: [name]: [score]
    
}
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 chương trình

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