Thêm cặp khóa-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 29 trên 66.
Bây giờ bạn đã có một từ điển băm trống, đã đến lúc thêm dữ liệu vào đó. Bạn có thể chèn các cặp khóa-giá trị vào từ điển băm bằng phương thức .insert():
let mut capitals = HashMap::new();
capitals.insert("France", "Paris");
capitals.insert("Japan", "Tokyo");Phương thức .insert() nhận hai tham số: khóa và giá trị. Trong ví dụ này, chúng ta lưu tên các quốc gia làm khóa và tên thủ đô của chúng làm giá trị.
Có một hành vi quan trọng cần nhớ: nếu bạn chèn một khóa đã có trong bản đồ băm, giá trị mới sẽ ghi đè giá trị cũ:
capitals.insert("France", "Lyon"); // Lệnh này ghi đè "Paris"Sau thao tác này, tra cứu "France" sẽ trả về "Lyon" thay vì "Paris". Cách ghi đè này khiến .insert() hữu ích cho cả việc thêm mục mới lẫn cập nhật mục hiện có trong bản đồ băm.
Thử thách
DễBạn sẽ nhận ba đầu vào: tên một sản phẩm, giá của sản phẩm đó (dưới dạng số thập phân) và tên một sản phẩm khác. Hãy tạo một từ điển băm (hash map) có thể thay đổi để lưu tên sản phẩm làm khóa (kiểu String) và giá làm giá trị (kiểu f64). Chèn sản phẩm đầu tiên cùng giá của nó vào từ điển băm. Sau đó, chèn sản phẩm thứ hai với giá 0.0. Cuối cùng, cập nhật giá của sản phẩm thứ hai thành 15.99 bằng cách chèn lại sản phẩm đó với giá mới. In tất cả thông tin theo đúng định dạng bên dưới.
Lưu ý về .clone(): Khi chèn một biến String làm khóa vào HashMap, các quy tắc sở hữu của Rust có nghĩa là biến đó sẽ bị di chuyển vào bản đồ và không thể dùng lại sau đó. Để tiếp tục dùng biến (ví dụ: để in ra hoặc chèn lại), hãy gọi .clone() trên biến khi truyền nó vào insert(). Ví dụ: map.insert(name.clone(), price).
Yêu cầu:
- Nhập
HashMaptừstd::collections - Tạo một từ điển băm có thể thay đổi với các kiểu
HashMap<String, f64> - Đọc đầu vào thứ nhất làm tên sản phẩm đầu tiên
- Đọc đầu vào thứ hai và chuyển đổi thành
f64để làm giá của sản phẩm đầu tiên - Chèn sản phẩm đầu tiên cùng giá của nó vào từ điển băm, dùng
.clone()trên tên sản phẩm - Đọc đầu vào thứ ba làm tên sản phẩm thứ hai
- Chèn sản phẩm thứ hai với giá
0.0, dùng.clone()trên tên sản phẩm - Chèn lại sản phẩm thứ hai với giá
15.99, dùng.clone()(thao tác này sẽ ghi đè giá trị trước đó) - In thông tin của cả hai sản phẩm theo đúng định dạng bên dưới
Đầu vào:
- Dòng thứ nhất: Tên sản phẩm đầu tiên (ví dụ:
Laptop) - Dòng thứ hai: Giá sản phẩm đầu tiên dưới dạng số thập phân (ví dụ:
999.99) - Dòng thứ ba: Tên sản phẩm thứ hai (ví dụ:
Mouse)
Đầu ra:
- Dòng thứ nhất:
Inserted [first_product] at $[price] - Dòng thứ hai:
Inserted [second_product] at $0.00 - Dòng thứ ba:
Updated [second_product] to $15.99
Tự làm thử
use std::collections::HashMap;
use std::io;
fn main() {
// Đọc dữ liệu đầu vào
let mut product1 = String::new();
io::stdin().read_line(&mut product1).expect("Failed to read line");
let product1 = product1.trim().to_string();
let mut price1_input = String::new();
io::stdin().read_line(&mut price1_input).expect("Failed to read line");
let price1: f64 = price1_input.trim().parse().expect("Failed to parse price");
let mut product2 = String::new();
io::stdin().read_line(&mut product2).expect("Failed to read line");
let product2 = product2.trim().to_string();
// TODO: Viết code bên dưới
// Tạo một HashMap có thể thay đổi, thêm các sản phẩm vào và in ra đầu ra theo yêu cầu
}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