중첩된 Map
Coddy Dart 여정의 로직 & 흐름 섹션에 포함된 레슨. 65개 중 31번째.
중첩 맵은 값 자체가 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중첩된 맵의 데이터에 접근하려면 대괄호를 여러 개 사용합니다. 첫 번째 대괄호 쌍은 바깥쪽 맵의 키에 접근하고, 두 번째 쌍은 안쪽 맵의 키에 접근합니다. 키가 없으면 맵 조회는 null을 반환하므로, 키가 존재한다는 것을 알고 있을 때는 첫 번째 조회 뒤에 !를 붙여야 합니다: userProfiles['alice']!['email']. 이 2단계 구조를 사용하면 관련 정보를 함께 묶어 체계적으로 정리하고 쉽게 접근할 수 있습니다.
챌린지
쉬움중첩 맵을 사용해 직원의 상세 정보를 저장하는 회사 직원 디렉터리 시스템을 관리하는 프로그램을 작성하세요. 프로그램은 다음을 수행해야 합니다.
- 회사 이름을 나타내는 문자열 입력을 읽습니다.
- 직원 데이터를 나타내는 여러 입력 세트를 읽습니다(입력은
"employees_done"을 받으면 끝납니다). 각 직원의 데이터는 다음과 같습니다.- 직원 ID(문자열)
- 이름(문자열)
- 부서(문자열)
- 급여(정수로 변환해야 하는 문자열)
- 경력(정수로 변환해야 하는 문자열)
- 조회할 직원 ID를 나타내는 문자열 입력을 읽습니다.
- 각 직원 ID를 키로 사용하고 직원의 상세 정보가 들어 있는 또 다른 맵을 값으로 사용하는 중첩 Map을 만듭니다.
- 중첩 맵 접근을 사용해 특정 직원 정보를 가져와 출력합니다.
- 부서별 통계를 계산하고 아래에 표시된 정확한 형식으로 직원 디렉터리 보고서를 출력합니다.
예를 들어 회사 이름이 "TechCorp Solutions"이고, 직원 데이터에 이름이 "Alice Johnson", 부서가 "Engineering", 급여가 75000, 경력이 5인 "EMP001", 이름이 "Bob Smith", 부서가 "Marketing", 급여가 60000, 경력이 3인 "EMP002", 이름이 "Carol Davis", 부서가 "Engineering", 급여가 80000, 경력이 7인 "EMP003"이 포함되고 조회할 직원 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"이고, 직원 데이터에 이름이 "David Wilson", 부서가 "Sales", 급여가 55000, 경력이 4인 "E100"과 이름이 "Emma Brown", 부서가 "HR", 급여가 65000, 경력이 6인 "E101"이 포함되며 조회할 직원 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"이고, 직원 데이터에 이름이 "Frank Miller", 부서가 "Development", 급여가 70000, 경력이 2인 "S001", 이름이 "Grace Lee", 부서가 "Design", 급여가 58000, 경력이 3인 "S002", 이름이 "Henry Chen", 부서가 "Development", 급여가 72000, 경력이 4인 "S003", 이름이 "Ivy Taylor", 부서가 "Marketing", 급여가 62000, 경력이 5인 "S004"가 포함되며 조회할 직원 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프로그램은 바깥쪽 맵에서 직원 ID를 키로 사용하고, 각 값이 "name", "department", "salary", "experience"를 키로 포함하는 안쪽 맵인 중첩 Map 구조를 만들어야 합니다. 특정 직원 정보를 가져올 때는 대괄호를 두 번 사용하는 중첩 맵 접근을 사용하세요. 부서별 직원 수를 세고 전체 급여 합계를 직원 수로 나누어 평균 급여를 계산하세요. 입력 형식은 회사 이름, 이어서 다섯 개의 값(직원 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. 전체 보고서를 요구된 형식으로 출력하기
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
로직 & 흐름의 모든 레슨
1고급 리스트 조작
리스트 속성: first 및 last리스트 상태: isEmpty 및 isNotEmpty리스트 뒤집기리스트에 추가: insert리스트 요소 제거: removeWhere리스트에서 찾기: indexOf리스트 정렬리스트 섞기요약 - 리스트 정리 도구직접 연습해 보세요: 온라인 Dart 컴파일러