Menu
CoddyTech

Các thuộc tính của Map: khóa và giá trị

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 28 trên 65.

Khi làm việc với các bộ sưu tập Map, đôi khi bạn cần trích xuất riêng tất cả khóa hoặc tất cả giá trị. Dart cung cấp hai thuộc tính tiện lợi cho việc này: .keys và .values.

Thuộc tính .keys trả về một đối tượng có thể lặp (iterable) chứa tất cả khóa trong map, còn .values trả về một đối tượng có thể lặp chứa tất cả giá trị tương ứng. Các thuộc tính này đặc biệt hữu ích khi bạn cần xử lý khóa và giá trị riêng biệt.

Map<String, double> inventory = {
  'Laptop': 999.99,
  'Mouse': 25.50,
  'Keyboard': 75.00
};

Iterable<String> productNames = inventory.keys;
Iterable<double> prices = inventory.values;

print(productNames);  // (Laptop, Mouse, Keyboard)
print(prices);        // (999.99, 25.5, 75.0)

Vì các thuộc tính này trả về các đối tượng có thể lặp thay vì danh sách, bạn có thể chuyển chúng thành danh sách bằng .toList() nếu cần các chức năng riêng của danh sách. Việc tách riêng khóa và giá trị đặc biệt hữu ích khi bạn cần phân tích hoặc thao tác với từng khía cạnh của dữ liệu mà không phụ thuộc vào khía cạnh còn lại.

challenge icon

Thử thách

Dễ

Tạo một chương trình quản lý hệ thống thư viện số bằng cách phân tích bộ sưu tập sách và trích xuất thông tin về tên sách cùng năm xuất bản. Chương trình cần:

  1. Đọc một chuỗi đầu vào đại diện cho tên thư viện
  2. Đọc nhiều cặp đầu vào đại diện cho tên sách và năm xuất bản (đầu vào sẽ kết thúc khi bạn nhận được "catalog_done")
  3. Tạo một Map để lưu tên mỗi cuốn sách làm khóa và năm xuất bản làm giá trị
  4. Dùng thuộc tính .keys để trích xuất tất cả tên sách và chuyển chúng thành List
  5. Dùng thuộc tính .values để trích xuất tất cả năm xuất bản và chuyển chúng thành List
  6. Tìm cuốn sách cũ nhất bằng cách xác định năm nhỏ nhất trong các giá trị
  7. Tìm cuốn sách mới nhất bằng cách xác định năm lớn nhất trong các giá trị
  8. In phân tích thư viện theo đúng định dạng bên dưới

Ví dụ, nếu tên thư viện là "Central Library" và danh mục có "To Kill a Mockingbird" với năm 1960, "1984" với năm 1949, "The Great Gatsby" với năm 1925, "Harry Potter" với năm 1997, chương trình của bạn cần in ra:

Library: Central Library
Book Collection Analysis:
All book titles: [To Kill a Mockingbird, 1984, The Great Gatsby, Harry Potter]
All publication years: [1960, 1949, 1925, 1997]
Total books in collection: 4
Oldest book year: 1925
Newest book year: 1997
Collection span: 72 years
Status: Library catalog analysis completed

Nếu tên thư viện là "University Library" và danh mục có "Pride and Prejudice" với năm 1813, "Moby Dick" với năm 1851, "Brave New World" với năm 1932, chương trình của bạn cần in ra:

Library: University Library
Book Collection Analysis:
All book titles: [Pride and Prejudice, Moby Dick, Brave New World]
All publication years: [1813, 1851, 1932]
Total books in collection: 3
Oldest book year: 1813
Newest book year: 1932
Collection span: 119 years
Status: Library catalog analysis completed

Nếu tên thư viện là "Community Library" và danh mục có "The Hobbit" với năm 1937, "Dune" với năm 1965, "Neuromancer" với năm 1984, "The Martian" với năm 2011, "Klara and the Sun" với năm 2021, chương trình của bạn cần in ra:

Library: Community Library
Book Collection Analysis:
All book titles: [The Hobbit, Dune, Neuromancer, The Martian, Klara and the Sun]
All publication years: [1937, 1965, 1984, 2011, 2021]
Total books in collection: 5
Oldest book year: 1937
Newest book year: 2021
Collection span: 84 years
Status: Library catalog analysis completed

Chương trình của bạn phải dùng thuộc tính .keys để trích xuất tất cả tên sách và thuộc tính .values để trích xuất tất cả năm xuất bản. Chuyển cả hai iterable thành List bằng .toList(). Tính khoảng thời gian của bộ sưu tập bằng cách lấy năm mới nhất trừ đi năm cũ nhất. Định dạng đầu vào sẽ là: tên thư viện, sau đó lần lượt là tên sách và năm xuất bản (dưới dạng chuỗi cần chuyển thành số nguyên), kết thúc bằng "catalog_done".

Tự làm thử

import 'dart:io';

void main() {
  // Đọc tên thư viện
  String? libraryName = stdin.readLineSync();
  
  // Tạo Map để lưu tên sách và năm xuất bản
  Map<String, int> bookCatalog = {};
  
  // Đọc tên sách và năm xuất bản cho đến khi gặp "catalog_done"
  while (true) {
    String? input = stdin.readLineSync();
    if (input == "catalog_done") {
      break;
    }
    String bookTitle = input!;
    String? yearInput = stdin.readLineSync();
    int publicationYear = int.parse(yearInput!);
    bookCatalog[bookTitle] = publicationYear;
  }
  
  // TODO: Viết code của bạn bên dưới
  // Lấy tên sách bằng thuộc tính (property) .keys rồi chuyển thành List
  // Lấy năm xuất bản bằng thuộc tính .values rồi chuyển thành List
  // Tìm năm xuất bản sớm nhất và muộn nhất
  // Tính khoảng thời gian của bộ sưu tập
  // In kết quả phân tích thư viện theo định dạng yêu cầu
  
  print("Library: $libraryName");
  print("Book Collection Analysis:");
  // Thêm các câu lệnh (statement) in kết quả ở đây
}
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