Menu
Coddy logo textTech

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']);      // 32

Aby 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ść.

challenge icon

Wyzwanie

Łatwy

Utwó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:

  1. Odczytać ciąg znaków reprezentujący nazwę firmy
  2. 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ą)
  3. Odczytać ciąg znaków reprezentujący ID pracownika, którego dane należy wyszukać
  4. 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
  5. Uzyskać dostęp do konkretnych informacji o pracowniku za pomocą zagnieżdżonego dostępu do mapy i wyświetlić je
  6. 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 successfully

Jeś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 successfully

Jeś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 successfully

Program 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
  
}
quiz iconSprawdź się

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

Poćwicz samodzielnie: Kompilator Dart online