중첩된 Map
Coddy Dart 여정의 로직 & 흐름 섹션에 포함된 레슨 — 65개 중 31번째.
때로는 단순한 키-값 쌍보다 더 복잡하고 계층적인 구조로 데이터를 구성해야 할 때가 있습니다. 중첩된 맵(Nested maps)을 사용하면 맵을 다른 맵의 값으로 저장할 수 있어, 여러 수준의 데이터 구성을 만들 수 있습니다.
중첩 맵은 단순히 값이 그 자체로 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중첩된 맵(nested map)의 데이터에 접근하려면 여러 개의 대괄호를 사용합니다. 첫 번째 대괄호 세트는 외부 맵의 키에 접근하고, 두 번째 세트는 내부 맵의 키에 접근합니다. 이러한 2단계 구조를 통해 관련 정보를 체계적이고 접근하기 쉽게 유지하면서 함께 그룹화할 수 있습니다.
챌린지
쉬움중첩 맵(nested maps)을 사용하여 상세한 직원 정보를 저장하는 회사의 직원 디렉토리 시스템 관리 프로그램을 작성하세요. 프로그램의 요구 사항은 다음과 같습니다:
- 회사 이름을 나타내는 문자열 입력을 읽습니다.
- 직원 데이터를 나타내는 여러 세트의 입력을 읽습니다 (입력은
"employees_done"을 받으면 종료됩니다). 각 직원은 다음 정보를 가집니다:- 직원 ID (문자열)
- 이름 (문자열)
- 부서 (문자열)
- 급여 (정수로 변환해야 하는 문자열)
- 경력 연수 (정수로 변환해야 하는 문자열)
- 조회할 직원 ID를 나타내는 문자열 입력을 읽습니다.
- 각 직원 ID를 키(key)로 하고, 해당 직원의 상세 정보를 담은 또 다른 맵(Map)을 값(value)으로 하는 중첩 맵을 생성합니다.
- 중첩 맵 접근 방식을 사용하여 특정 직원의 정보에 접근하고 표시합니다.
- 부서별 통계를 계산하고 아래에 표시된 정확한 형식으로 직원 디렉토리 보고서를 출력합니다.
예를 들어, 회사 이름이 "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"를 키로 갖는 내부 맵인 중첩 맵 구조를 생성해야 합니다. 특정 직원 정보를 검색하려면 대괄호를 두 번 사용하는 중첩 맵 접근 방식을 사용하세요. 부서별 직원 수를 세고, 총 급여 합계를 직원 수로 나누어 평균 급여를 계산하세요. 입력 형식은 회사 이름, 그 다음 다섯 가지 값(직원 ID, 이름, 부서, 급여, 경력)의 세트가 "employees_done"으로 끝날 때까지 이어지며, 마지막으로 조회할 직원 ID가 주어집니다.
치트 시트
중첩 맵(Nested maps)을 사용하면 맵을 다른 맵의 값으로 저장하여 계층적인 데이터 구조를 만들 수 있습니다:
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첫 번째 대괄호는 바깥쪽 맵의 키에 접근하고, 두 번째 대괄호는 안쪽 맵의 키에 접근합니다.
직접 해보기
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리스트 정렬리스트 섞기요약 - 리스트 정리 도구