Zagnieżdżone mapy
Część sekcji Logika i przepływ sterowania ścieżki Dart w Coddy. Lekcja 31 z 65.
Czasami musisz uporządkować dane w bardziej złożonej, hierarchicznej strukturze niż prosta para klucz-wartość. Zagnieżdżone mapy pozwalają przechowywać mapy jako wartości w innych mapach, tworząc wiele poziomów organizacji danych.
Zagnieżdżona mapa to po prostu Map, w której wartościami są obiekty Map. Ta struktura idealnie nadaje się do reprezentowania danych z kategoriami i podkategoriami, takich jak profile użytkowników z wieloma szczegółami lub katalogi produktów z różnymi atrybutami.
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']); // 32Aby uzyskać dostęp do danych w zagnieżdżonej mapie, używasz kilku par nawiasów kwadratowych. Pierwsza para umożliwia dostęp do klucza mapy zewnętrznej, a druga — do klucza mapy wewnętrznej. Ta dwupoziomowa struktura ułatwia grupowanie powiązanych informacji, a jednocześnie pozwala zachować ich uporządkowanie i dostępność.
Wyzwanie
ŁatwyUtwórz program, który zarządza systemem katalogu pracowników firmy, używając zagnieżdżonych map do przechowywania szczegółowych informacji o pracownikach. Program powinien:
- Odczytać ciąg znaków reprezentujący nazwę firmy
- Odczytywać wiele zestawów danych wejściowych reprezentujących dane pracowników (wprowadzanie zakończy się po otrzymaniu
"employees_done"). Każdy pracownik będzie mieć:- ID pracownika (ciąg znaków)
- Imię i nazwisko (ciąg znaków)
- Dział (ciąg znaków)
- Wynagrodzenie (ciąg znaków, który należy przekonwertować na liczbę całkowitą)
- Lata doświadczenia (ciąg znaków, który należy przekonwertować na liczbę całkowitą)
- Odczytać ciąg znaków reprezentujący ID pracownika, którego dane należy wyszukać
- Utworzyć zagnieżdżoną mapę, w której każde ID pracownika jest kluczem, a wartością jest kolejna mapa zawierająca szczegółowe informacje o pracowniku
- Uzyskać dostęp do konkretnych informacji o pracowniku za pomocą zagnieżdżonego dostępu do mapy i wyświetlić je
- Obliczyć statystyki działów i wydrukować raport katalogu pracowników dokładnie w formacie pokazanym poniżej
Na przykład, jeśli nazwa firmy to "TechCorp Solutions", dane pracowników obejmują "EMP001" o imieniu i nazwisku "Alice Johnson", pracującą w dziale "Engineering", z wynagrodzeniem 75000 i doświadczeniem 5, "EMP002" o imieniu i nazwisku "Bob Smith", pracującym w dziale "Marketing", z wynagrodzeniem 60000 i doświadczeniem 3, "EMP003" o imieniu i nazwisku "Carol Davis", pracującą w dziale "Engineering", z wynagrodzeniem 80000 i doświadczeniem 7, a ID pracownika do wyszukania to "EMP001", program powinien wyświetlić:
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 successfullyJeśli nazwa firmy to "Global Industries", dane pracowników obejmują "E100" o imieniu i nazwisku "David Wilson", pracującym w dziale "Sales", z wynagrodzeniem 55000 i doświadczeniem 4, "E101" o imieniu i nazwisku "Emma Brown", pracującą w dziale "HR", z wynagrodzeniem 65000 i doświadczeniem 6, a ID pracownika do wyszukania to "E101", program powinien wyświetlić:
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 successfullyJeśli nazwa firmy to "StartupHub", dane pracowników obejmują "S001" o imieniu i nazwisku "Frank Miller", pracującym w dziale "Development", z wynagrodzeniem 70000 i doświadczeniem 2, "S002" o imieniu i nazwisku "Grace Lee", pracującą w dziale "Design", z wynagrodzeniem 58000 i doświadczeniem 3, "S003" o imieniu i nazwisku "Henry Chen", pracującym w dziale "Development", z wynagrodzeniem 72000 i doświadczeniem 4, "S004" o imieniu i nazwisku "Ivy Taylor", pracującą w dziale "Marketing", z wynagrodzeniem 62000 i doświadczeniem 5, a ID pracownika do wyszukania to "S003", program powinien wyświetlić:
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 successfullyProgram musi utworzyć zagnieżdżoną strukturę mapy, w której mapa zewnętrzna używa ID pracowników jako kluczy, a każda wartość jest mapą wewnętrzną zawierającą klucze "name", "department", "salary" i "experience". Użyj zagnieżdżonego dostępu do mapy z podwójnymi nawiasami kwadratowymi, aby pobrać konkretne informacje o pracowniku. Policz pracowników w każdym dziale i oblicz średnie wynagrodzenie, dzieląc sumę wszystkich wynagrodzeń przez liczbę pracowników. Format danych wejściowych będzie następujący: nazwa firmy, następnie zestawy pięciu wartości (ID pracownika, imię i nazwisko, dział, wynagrodzenie, doświadczenie), zakończone wartością "employees_done", a następnie ID pracownika do wyszukania.
Spróbuj swoich sił
import 'dart:io';
void main() {
// Wczytaj nazwę firmy
String? companyName = stdin.readLineSync();
// Zainicjalizuj zagnieżdżoną mapę na potrzeby katalogu pracowników
Map<String, Map<String, dynamic>> employeeDirectory = {};
// Wczytuj dane pracowników aż do "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();
// Przekonwertuj wynagrodzenie i staż pracy na liczby całkowite
int salary = int.parse(salaryStr!);
int experience = int.parse(experienceStr!);
// TODO: Utwórz strukturę zagnieżdżonych map dla każdego pracownika i dodaj ją do katalogu
}
// Wczytaj identyfikator pracownika do wyszukania
String? lookupId = stdin.readLineSync();
// TODO: Napisz poniżej kod, który:
// 1. Wyświetli nazwę firmy i katalog pracowników
// 2. Wyszuka i wyświetli informacje o wskazanym pracowniku
// 3. Obliczy statystyki działów
// 4. Obliczy średnie wynagrodzenie
// 5. Wydrukuje pełny raport w wymaganym formacie
}Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Logika i przepływ sterowania
1Zaawansowana manipulacja listami
Właściwości listy: first i lastStan listy: isEmpty i isNotEmpOdwracanie listyDodawanie do listy: insertUsuwanie z listy: removeWhereWyszukiwanie na liście: indexOfSortowanie listyMieszanie elementów listyPodsumowanie – Organizator listy4Zaawansowane operacje na mapach
Iterowanie po mapieSprawdzanie kluczy i wartościWłaściwości mapy: klucze i wartościDodawanie warunkowe: putIfAbsentUsuwanie wpisów z mapyZagnieżdżone mapyPodsumowanie – aktualizacja stanu magazynowego2Operacje funkcyjne na listach
Przekształcanie za pomocą 'map'Filtrowanie za pomocą 'where'Używanie '.toList()'Sprawdzanie warunków za pomocą 'any'Warunki z użyciem 'every'Wyszukiwanie za pomocą 'firstWhere'Podsumowanie — filtrowanie danych5Projekt: Kalkulator koszyka zakupowego
Konfiguracja projektuDodawanie produktów do koszyka3Zbiory
Czym jest zbiór?Tworzenie zbioruDodawanie i usuwanie elementów ze zbiorówSprawdzanie, czy element znajduje się w zbiorzeKonwersja listy na zbiórSuma zbiorówCzęść wspólna zbiorówRóżnica zbiorówPodsumowanie — unikalna lista gościPoćwicz samodzielnie: Kompilator Dart online