Verschachtelte Maps
Teil des Abschnitts Logik & Ablauf der Dart-Journey von Coddy. Lektion 31 von 65.
Manchmal musst du Daten in einer komplexeren, hierarchischen Struktur organisieren als in einem einfachen Schlüssel-Wert-Paar. Verschachtelte Maps ermöglichen es dir, Maps als Werte in anderen Maps zu speichern und so mehrere Ebenen der Datenorganisation zu schaffen.
Eine verschachtelte Map ist einfach eine Map, bei der die Werte selbst Map-Objekte sind. Diese Struktur eignet sich perfekt, um Daten mit Kategorien und Unterkategorien darzustellen, etwa Benutzerprofile mit mehreren Details oder Produktkataloge mit verschiedenen Attributen.
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']); // 32Um auf Daten in einer verschachtelten Map zuzugreifen, verwendest du mehrere eckige Klammern. Mit der ersten Klammer greifst du auf den Schlüssel der äußeren Map zu und mit der zweiten auf den Schlüssel der inneren Map. Eine Map-Abfrage gibt null zurück, wenn der Schlüssel fehlt. Daher benötigt Dart nach dem ersten Zugriff ein !, wenn du weißt, dass der Schlüssel vorhanden ist: userProfiles['alice']!['email']. Mit dieser zweistufigen Struktur lassen sich zusammengehörige Informationen einfach gruppieren und zugleich übersichtlich und zugänglich halten.
Aufgabe
EinfachErstelle ein Programm, das das Mitarbeiterverzeichnis eines Unternehmens mithilfe verschachtelter Maps verwaltet, um detaillierte Mitarbeiterinformationen zu speichern. Dein Programm soll:
- Mehrere Eingabesätze mit Mitarbeiterdaten einlesen (die Eingabe endet, wenn du
"employees_done"erhältst). Jeder Mitarbeiter hat:- Mitarbeiter-ID (Zeichenfolge)
- Name (Zeichenfolge)
- Abteilung (Zeichenfolge)
- Gehalt (Zeichenfolge, die in eine Ganzzahl umgewandelt werden muss)
- Berufserfahrung in Jahren (Zeichenfolge, die in eine Ganzzahl umgewandelt werden muss)
- Eine Zeichenfolgeneingabe einlesen, die eine nachzuschlagende Mitarbeiter-ID darstellt
- Eine verschachtelte Map erstellen, in der jede Mitarbeiter-ID ein Schlüssel ist und der Wert eine weitere Map mit den Details des Mitarbeiters enthält
- Mithilfe des Zugriffs auf verschachtelte Maps bestimmte Mitarbeiterinformationen abrufen und ausgeben
- Statistiken zu den Abteilungen berechnen und den Bericht des Mitarbeiterverzeichnisses genau im unten gezeigten Format ausgeben
Wenn der Unternehmensname beispielsweise "TechCorp Solutions" lautet, die Mitarbeiterdaten "EMP001" mit dem Namen "Alice Johnson", der Abteilung "Engineering", dem Gehalt 75000 und der Berufserfahrung 5, "EMP002" mit dem Namen "Bob Smith", der Abteilung "Marketing", dem Gehalt 60000 und der Berufserfahrung 3, "EMP003" mit dem Namen "Carol Davis", der Abteilung "Engineering", dem Gehalt 80000 und der Berufserfahrung 7 umfassen und die nachzuschlagende Mitarbeiter-ID "EMP001" ist, sollte dein Programm Folgendes ausgeben:
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 successfullyWenn der Unternehmensname "Global Industries" lautet, die Mitarbeiterdaten "E100" mit dem Namen "David Wilson", der Abteilung "Sales", dem Gehalt 55000 und der Berufserfahrung 4, "E101" mit dem Namen "Emma Brown", der Abteilung "HR", dem Gehalt 65000 und der Berufserfahrung 6 umfassen und die nachzuschlagende Mitarbeiter-ID "E101" ist, sollte dein Programm Folgendes ausgeben:
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 successfullyWenn der Unternehmensname "StartupHub" lautet, die Mitarbeiterdaten "S001" mit dem Namen "Frank Miller", der Abteilung "Development", dem Gehalt 70000 und der Berufserfahrung 2, "S002" mit dem Namen "Grace Lee", der Abteilung "Design", dem Gehalt 58000 und der Berufserfahrung 3, "S003" mit dem Namen "Henry Chen", der Abteilung "Development", dem Gehalt 72000 und der Berufserfahrung 4, "S004" mit dem Namen "Ivy Taylor", der Abteilung "Marketing", dem Gehalt 62000 und der Berufserfahrung 5 umfassen und die nachzuschlagende Mitarbeiter-ID "S003" ist, sollte dein Programm Folgendes ausgeben:
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 successfullyDein Programm muss eine verschachtelte Map-Struktur erstellen, in der die äußere Map Mitarbeiter-IDs als Schlüssel verwendet und jeder Wert eine innere Map mit "name", "department", "salary" und "experience" als Schlüsseln enthält. Verwende den Zugriff auf verschachtelte Maps mit doppelten eckigen Klammern, um bestimmte Mitarbeiterinformationen abzurufen. Zähle die Mitarbeiter pro Abteilung und berechne das Durchschnittsgehalt, indem du die Gesamtgehaltssumme durch die Anzahl der Mitarbeiter teilst. Das Eingabeformat lautet: Unternehmensname, anschließend Sätze aus jeweils fünf Werten (Mitarbeiter-ID, Name, Abteilung, Gehalt, Berufserfahrung), die mit "employees_done" enden, gefolgt von der nachzuschlagenden Mitarbeiter-ID.
Probier es selbst
import 'dart:io';
void main() {
// Firmennamen einlesen
String? companyName = stdin.readLineSync();
// Verschachtelte Map für das Mitarbeiterverzeichnis initialisieren
Map<String, Map<String, dynamic>> employeeDirectory = {};
// Mitarbeiterdaten bis "employees_done" einlesen
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();
// Gehalt und Berufserfahrung in Ganzzahlen umwandeln
int salary = int.parse(salaryStr!);
int experience = int.parse(experienceStr!);
// TODO: Für jeden Mitarbeiter eine verschachtelte Map-Struktur erstellen und zum Verzeichnis hinzufügen
}
// Mitarbeiter-ID für die Suche einlesen
String? lookupId = stdin.readLineSync();
// TODO: Schreibe unten deinen Code, um:
// 1. Firmennamen und Mitarbeiterverzeichnis anzuzeigen
// 2. Informationen zu einem bestimmten Mitarbeiter zu suchen und anzuzeigen
// 3. Abteilungsstatistiken zu berechnen
// 4. Das Durchschnittsgehalt zu berechnen
// 5. Den vollständigen Bericht im geforderten Format auszugeben
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Ablauf
1Fortgeschrittene Listenmanipulation
Listen-Eigenschaften: first & lastListen-Status: isEmpty & isNotEmptyEine Liste umkehrenHinzufügen zu einer Liste: insertElemente aus Liste entfernen: removeWhereSuchen in einer Liste: indexOfEine Liste sortierenEine Liste mischenZusammenfassung – Listen-Organizer4Fortgeschrittene Map-Manipulation
Über eine Map iterierenPrüfen auf Schlüssel und WerteMap-Eigenschaften: keys & valuesBedingtes Hinzufügen: putIfAbsentEinträge aus einer Map entfernenVerschachtelte MapsRückblick – Inventar-Update7Fortgeschrittene Funktionen
Anonyme FunktionenFunktionen als Argumente übergebenClosures verstehenEinführung in die RekursionRekursive Funktion: CountdownRekursive Funktion: FakultätZusammenfassung – List Processor10Abschluss-Herausforderungen
Herausforderung: NotensortiererHerausforderung: VokalzählerHerausforderung: FizzBuzz2Funktionale Listenoperationen
Transformieren mit 'map'Filtern mit 'where''.toList()' verwendenBedingungen prüfen mit 'any'Bedingungen mit 'every'Suchen mit 'firstWhere'Zusammenfassung – Datenfilterung3Sets
Was ist ein Set?Ein Set erstellenHinzufügen und Entfernen in SetsPrüfen auf Elemente in einem SetEine Liste in ein Set umwandelnSet-VereinigungSet-SchnittmengeSet-DifferenzRückblick – Einzigartige GästelisteÜbe selbstständig: Online-Dart-Compiler