Menu
CoddyTech

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.

challenge icon

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 HashMap từ 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
    
}
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