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.
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:
- Đọc một chuỗi đầu vào đại diện cho tên thư viện
- Đọ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") - 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ị
- 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 - 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 - 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ị
- 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ị
- 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 completedNế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 completedNế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 completedChươ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
}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
1Thao tác nâng cao với danh sách
Thuộc tính danh sách: đầu và cuốiTrạng thái danh sách: isEmpty và isNotEmpĐảo ngược danh sáchThêm vào danh sách: insertXóa khỏi danh sách: removeWhereTìm trong danh sách: indexOfSắp xếp danh sáchXáo trộn danh sáchÔn tập: trình sắp xếp danh sách4Thao tác nâng cao với Map
Duyệt qua MapKiểm tra khóa và giá trịCác thuộc tính của Map: khóa và giá trịThêm có điều kiện: putIfAbsentXóa mục khỏi MapMap lồng nhauÔn tập: Cập nhật kho hàng2Thao tác hàm trên danh sách
Biến đổi bằng 'map'Lọc bằng 'where'Dùng '.toList()'Kiểm tra điều kiện bằng 'any'Điều kiện với 'every'Tìm phần tử bằng 'firstWhere'Ôn tập: lọc dữ liệu5Dự án: Tính tiền giỏ hàng
Thiết lập dự ánThêm mặt hàng vào giỏ8Dự án: Trình phân tích văn bản đơn giản
Tổng quan và thiết lập dự ánĐếm ký tự3Tập hợp
Tập hợp là gì?Tạo tập hợpThêm và xóa phần tử khỏi tập hợpKiểm tra phần tử trong tập hợpChuyển danh sách thành tập hợpPhép hợp của các tập hợpPhép giao của các tập hợpPhép hiệu của các tập hợpÔn tập: danh sách khách mời không trùng lặpTự luyện tập: Trình biên dịch Dart online