嵌套映射
本课属于 Coddy Dart 学习旅程的“逻辑与流程控制”单元。第 31 课,共 65 课。
有时,你需要用比简单键值对更复杂的层级结构来组织数据。嵌套映射可以让你将映射存储为其他映射中的值,从而创建多个层级的数据组织结构。
嵌套映射就是一个值本身也是 Map 对象的 Map。这种结构非常适合表示包含类别和子类别的数据,例如包含多项详细信息的用户档案,或包含各种属性的产品目录。
Map<String, Map<String, dynamic>> userProfiles = {
'alice': {
'email': 'alice@example.com',
'age': 28
},
'bob': {
'email': 'bob@example.com',
'age': 32
}
};
print(userProfiles['alice']['email']); // alice@example.com
print(userProfiles['bob']['age']); // 32要访问嵌套映射中的数据,你需要使用多组方括号。第一组用于访问外层映射的键,第二组用于访问内层映射的键。这种两层结构可以轻松地将相关信息归类,同时让信息保持有序且易于访问。
挑战
简单创建一个程序,使用嵌套映射来存储详细的员工信息,并管理公司的员工名录系统。你的程序应当:
- 读取一个表示公司名称的字符串输入
- 读取多组表示员工数据的输入(收到
"employees_done"时,输入结束)。每位员工的数据包括:- 员工 ID(字符串)
- 姓名(字符串)
- 部门(字符串)
- 工资(需要转换为整数的字符串)
- 工作年限(需要转换为整数的字符串)
- 读取一个表示待查询员工 ID 的字符串输入
- 创建一个嵌套 Map,每个员工 ID 都是一个键,对应的值是另一个包含该员工详细信息的 Map
- 使用嵌套映射访问特定员工的信息并显示
- 计算部门统计数据,并按照下方显示的准确格式打印员工名录报告
例如,公司名称为 "TechCorp Solutions",员工数据包括:"EMP001",姓名为 "Alice Johnson",部门为 "Engineering",工资为 75000,工作年限为 5;"EMP002",姓名为 "Bob Smith",部门为 "Marketing",工资为 60000,工作年限为 3;"EMP003",姓名为 "Carol Davis",部门为 "Engineering",工资为 80000,工作年限为 7;待查询的员工 ID 为 "EMP001",那么你的程序应输出:
Company: TechCorp Solutions
Employee Directory: {EMP001: {name: Alice Johnson, department: Engineering, salary: 75000, experience: 5}, EMP002: {name: Bob Smith, department: Marketing, salary: 60000, experience: 3}, EMP003: {name: Carol Davis, department: Engineering, salary: 80000, experience: 7}}
Employee Lookup (EMP001):
Name: Alice Johnson
Department: Engineering
Salary: $75000
Experience: 5 years
Department Analysis:
Engineering employees: 2
Marketing employees: 1
Total employees: 3
Average salary: $71666
Status: Employee directory processed successfully如果公司名称为 "Global Industries",员工数据包括:"E100",姓名为 "David Wilson",部门为 "Sales",工资为 55000,工作年限为 4;"E101",姓名为 "Emma Brown",部门为 "HR",工资为 65000,工作年限为 6;待查询的员工 ID 为 "E101",那么你的程序应输出:
Company: Global Industries
Employee Directory: {E100: {name: David Wilson, department: Sales, salary: 55000, experience: 4}, E101: {name: Emma Brown, department: HR, salary: 65000, experience: 6}}
Employee Lookup (E101):
Name: Emma Brown
Department: HR
Salary: $65000
Experience: 6 years
Department Analysis:
Sales employees: 1
HR employees: 1
Total employees: 2
Average salary: $60000
Status: Employee directory processed successfully如果公司名称为 "StartupHub",员工数据包括:"S001",姓名为 "Frank Miller",部门为 "Development",工资为 70000,工作年限为 2;"S002",姓名为 "Grace Lee",部门为 "Design",工资为 58000,工作年限为 3;"S003",姓名为 "Henry Chen",部门为 "Development",工资为 72000,工作年限为 4;"S004",姓名为 "Ivy Taylor",部门为 "Marketing",工资为 62000,工作年限为 5;待查询的员工 ID 为 "S003",那么你的程序应输出:
Company: StartupHub
Employee Directory: {S001: {name: Frank Miller, department: Development, salary: 70000, experience: 2}, S002: {name: Grace Lee, department: Design, salary: 58000, experience: 3}, S003: {name: Henry Chen, department: Development, salary: 72000, experience: 4}, S004: {name: Ivy Taylor, department: Marketing, salary: 62000, experience: 5}}
Employee Lookup (S003):
Name: Henry Chen
Department: Development
Salary: $72000
Experience: 4 years
Department Analysis:
Development employees: 2
Design employees: 1
Marketing employees: 1
Total employees: 4
Average salary: $65500
Status: Employee directory processed successfully你的程序必须创建一个嵌套 Map 结构,外层 Map 使用员工 ID 作为键,每个值都是一个内层 Map,其中包含 "name"、"department"、"salary" 和 "experience" 这些键。使用双层方括号进行嵌套映射访问,以获取特定员工的信息。按部门统计员工人数,并用工资总和除以员工人数来计算平均工资。输入格式为:公司名称,然后是多组五个值(员工 ID、姓名、部门、工资、工作年限),以 "employees_done" 结束,最后输入待查询的员工 ID。
亲手试试
import 'dart:io';
void main() {
// 读取公司名称
String? companyName = stdin.readLineSync();
// 为员工目录初始化嵌套映射
Map<String, Map<String, dynamic>> employeeDirectory = {};
// 读取员工数据,直到遇到 "employees_done"
while (true) {
String? input = stdin.readLineSync();
if (input == "employees_done") {
break;
}
String employeeId = input!;
String? name = stdin.readLineSync();
String? department = stdin.readLineSync();
String? salaryStr = stdin.readLineSync();
String? experienceStr = stdin.readLineSync();
// 将薪资和工作年限转换为整数
int salary = int.parse(salaryStr!);
int experience = int.parse(experienceStr!);
// TODO:为每位员工创建嵌套映射结构,并将其添加到目录中
}
// 读取要查询的员工 ID
String? lookupId = stdin.readLineSync();
// TODO:在下方编写代码,完成以下任务:
// 1. 显示公司名称和员工目录
// 2. 查询并显示指定员工的信息
// 3. 计算部门统计数据
// 4. 计算平均薪资
// 5. 按要求的格式打印完整报告
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程控制中的所有课
自己练习: Dart 在线编译器