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).
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
HashMaptừ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
ntê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ố100nế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) ndò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]
}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
1Luồng điều khiển nâng cao
Biểu thức 'match'Khớp nhiều giá trịKhớp các phạm viBiểu thức 'if let'Vòng lặp dưới dạng biểu thứcÔn tập: Trình phân tích cú pháp lệnh đơn giản4Nhóm dữ liệu bằng Struct
Struct là gì?Tổng quan về StructTruy cập các trường của StructStruct có thể thay đổiStruct làm tham số cho hàmStruct dạng tupleÔn tập: Tạo Struct Book2Giới thiệu về vector
Vector là gì?Tạo vectorThêm phần tử bằng pushTruy cập phần tử trong vectorLặp qua vectorLặp có thể thay đổiXóa phần tửÔn tập: Bộ theo dõi điểm số cơ bản5Cặp khóa-giá trị với bảng băm
Bảng băm là gì?Tạo bảng bămThêm cặp khóa-giá trịTruy cập giá trịDuyệt qua bảng bămCập nhật giá trịXóa một cặpÔn tập: Bộ đếm từ8Dự án: Quản lý kho hàng đơn giản
Thiết lập dự ánThêm mặt hàngKiểm tra hàng tồn khoBán mặt hàngKết hợp tất cả11Thử thách cuối cùng
Ôn tập: Các mục duy nhấtÔn tập: Trình xác thực hồ sơ người dùngÔn tập: Tổng hợp điểm3Danh sách việc cần làm trên dòng lệnh
Thiết lập dự ánThêm một việcXem tất cả việcXóa một việcCode hoàn chỉnh6Xử lý giá trị vắng mặt với 'Option'
'Option' là gì?Dùng 'match' với 'Option'is_some() và is_none()Lấy giá trị từ 'Option'expectCung cấp giá trị mặc định: unwrap_orÔn tập: tìm một phần tử9Lát cắt chuỗi và hơn thế nữa
String và &strTạo lát cắt chuỗiLát cắt làm tham số hàmCác lát cắt khácÔn tập: Tìm từ đầu tiênTự luyện tập: Trình biên dịch Rust online