映射属性:键和值
本课属于 Coddy Dart 学习旅程的“逻辑与流程控制”单元。第 28 课,共 65 课。
使用 Map 集合时,有时需要分别提取所有键或所有值。Dart 提供了两个方便的属性:.keys 和 .values。
.keys 属性会返回一个包含映射中所有键的可迭代对象,而 .values 会返回一个包含所有对应值的可迭代对象。当你需要分别处理键和值时,这些属性特别有用。
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)由于这些属性返回的是可迭代对象,而不是列表,如果你需要列表特有的功能,可以使用 .toList() 将它们转换为列表。将键和值分开,在你需要独立分析或操作数据的某一方面时尤其有用。
挑战
简单创建一个程序,通过分析书籍馆藏并提取书名及其出版年份信息来管理数字图书馆系统。你的程序应当:
- 读取一个表示图书馆名称的字符串输入
- 读取多组输入,每组包含书名和出版年份(收到
"catalog_done"时输入结束) - 创建一个 Map,将每本书的书名作为键,将出版年份作为值
- 使用
.keys属性提取所有书名,并将它们转换为 List - 使用
.values属性提取所有出版年份,并将它们转换为 List - 从这些值中找出最小年份,以确定最早出版的书
- 从这些值中找出最大年份,以确定最新出版的书
- 按照下方所示的确切格式打印图书馆分析结果
例如,如果图书馆名称是 "Central Library",馆藏包括出版于 1960 年的 "To Kill a Mockingbird"、出版于 1949 年的 "1984"、出版于 1925 年的 "The Great Gatsby",以及出版于 1997 年的 "Harry Potter",你的程序应输出:
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如果图书馆名称是 "University Library",馆藏包括出版于 1813 年的 "Pride and Prejudice"、出版于 1851 年的 "Moby Dick",以及出版于 1932 年的 "Brave New World",你的程序应输出:
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如果图书馆名称是 "Community Library",馆藏包括出版于 1937 年的 "The Hobbit"、出版于 1965 年的 "Dune"、出版于 1984 年的 "Neuromancer"、出版于 2011 年的 "The Martian",以及出版于 2021 年的 "Klara and the Sun",你的程序应输出:
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你的程序必须使用 .keys 属性提取所有书名,并使用 .values 属性提取所有出版年份。使用 .toList() 将两个可迭代对象都转换为 List。通过用最新年份减去最早年份来计算馆藏跨度。输入格式为:图书馆名称,然后是交替出现的书名和出版年份(年份以字符串形式输入,需要转换为整数),最后以 "catalog_done" 结束。
亲手试试
import 'dart:io';
void main() {
// 读取库名称
String? libraryName = stdin.readLineSync();
// 创建一个 Map,存储书名和出版年份
Map<String, int> bookCatalog = {};
// 读取书名和出版年份,直到遇到 "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: 在下方编写你的代码
// 使用 .keys 属性提取书名,并转换为 List
// 使用 .values 属性提取出版年份,并转换为 List
// 找出最早和最晚的出版年份
// 计算藏书的年份跨度
// 按要求的格式输出库的分析结果
print("Library: $libraryName");
print("Book Collection Analysis:");
// 在这里添加你的输出语句
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程控制中的所有课
自己练习: Dart 在线编译器