Menu
CoddyTech

İç İçe Map'ler

Coddy'nin Dart Journey'sinin Mantık & Akış bölümünün bir parçası. Ders 31 / 65.

Bazen verileri basit bir anahtar-değer çiftinden daha karmaşık, hiyerarşik bir yapıda düzenlemeniz gerekir. İç içe geçmiş map'ler, map'leri başka map'lerin içinde değer olarak saklamanıza ve verileri birden çok düzeyde düzenlemenize olanak tanır.

İç içe geçmiş bir eşleme, değerleri de Map nesneleri olan bir Map nesnesidir. Bu yapı, birden çok ayrıntı içeren kullanıcı profilleri veya çeşitli niteliklere sahip ürün katalogları gibi kategorileri ve alt kategorileri olan verileri temsil etmek için idealdir.

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

İç içe geçmiş bir eşlemedeki verilere erişmek için birden fazla köşeli parantez kullanırsın. İlk parantez grubu dış eşlemenin anahtarına, ikinci grup ise iç eşlemenin anahtarına erişir. Bir eşleme araması, anahtar bulunamadığında null döndürür; bu nedenle anahtarın var olduğunu bildiğinde Dart, ilk aramadan sonra bir ! gerektirir: userProfiles['alice']!['email']. Bu iki seviyeli yapı, ilgili bilgileri düzenli ve erişilebilir tutarken bunları birlikte gruplandırmayı kolaylaştırır.

challenge icon

Görev

Kolay

Çalışanlarla ilgili ayrıntılı bilgileri iç içe eşlemelerde saklayarak bir şirketin çalışan dizini sistemini yöneten bir program oluştur. Programın şunları yapmalıdır:

  1. Şirket adını temsil eden bir dizge girdisi oku
  2. Çalışan verilerini temsil eden birden fazla girdi kümesi oku (girdi, "employees_done" değerini aldığında sona erecektir). Her çalışan için şu bilgiler bulunur:
    • Çalışan kimliği (dizge)
    • Ad (dizge)
    • Departman (dizge)
    • Maaş (tam sayıya dönüştürülmesi gereken dizge)
    • Deneyim yılı (tam sayıya dönüştürülmesi gereken dizge)
  3. Aranacak çalışan kimliğini temsil eden bir dizge girdisi oku
  4. Her çalışan kimliğinin anahtar, değerinin ise çalışanın ayrıntılarını içeren başka bir Map olduğu iç içe bir Map oluştur
  5. İç içe eşleme erişimini kullanarak belirli çalışan bilgilerine eriş ve bunları görüntüle
  6. Departman istatistiklerini hesapla ve çalışan dizini raporunu aşağıda gösterilen biçimin aynısıyla yazdır

Örneğin, şirket adı "TechCorp Solutions" ise, çalışan verileri adı "Alice Johnson", departmanı "Engineering", maaşı 75000 ve deneyimi 5 olan "EMP001" çalışanını; adı "Bob Smith", departmanı "Marketing", maaşı 60000 ve deneyimi 3 olan "EMP002" çalışanını; adı "Carol Davis", departmanı "Engineering", maaşı 80000 ve deneyimi 7 olan "EMP003" çalışanını içeriyorsa ve aranacak çalışan kimliği "EMP001" ise programın şu çıktıyı vermelidir:

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

Şirket adı "Global Industries" ise, çalışan verileri adı "David Wilson", departmanı "Sales", maaşı 55000 ve deneyimi 4 olan "E100" çalışanını; adı "Emma Brown", departmanı "HR", maaşı 65000 ve deneyimi 6 olan "E101" çalışanını içeriyorsa ve aranacak çalışan kimliği "E101" ise programın şu çıktıyı vermelidir:

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

Şirket adı "StartupHub" ise, çalışan verileri adı "Frank Miller", departmanı "Development", maaşı 70000 ve deneyimi 2 olan "S001" çalışanını; adı "Grace Lee", departmanı "Design", maaşı 58000 ve deneyimi 3 olan "S002" çalışanını; adı "Henry Chen", departmanı "Development", maaşı 72000 ve deneyimi 4 olan "S003" çalışanını; adı "Ivy Taylor", departmanı "Marketing", maaşı 62000 ve deneyimi 5 olan "S004" çalışanını içeriyorsa ve aranacak çalışan kimliği "S003" ise programın şu çıktıyı vermelidir:

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ın, dış eşlemenin anahtar olarak çalışan kimliklerini kullandığı ve her değerin anahtar olarak "name", "department", "salary" ve "experience" değerlerini içeren bir iç eşleme olduğu iç içe bir Map yapısı oluşturmalıdır. Belirli çalışan bilgilerini almak için çift köşeli parantez kullanarak iç içe eşleme erişimini kullan. Çalışanları departmana göre say ve toplam maaş tutarını çalışan sayısına bölerek ortalama maaşı hesapla. Girdi biçimi şöyle olacaktır: şirket adı, ardından "employees_done" ile sona eren beşer değerlik kümeler (çalışan kimliği, ad, departman, maaş, deneyim) ve son olarak aranacak çalışan kimliği.

Kendin dene

import 'dart:io';

void main() {
  // Şirket adını oku
  String? companyName = stdin.readLineSync();
  
  // Çalışan dizini için iç içe geçmiş map yapısını başlat
  Map<String, Map<String, dynamic>> employeeDirectory = {};
  
  // "employees_done" değerine kadar çalışan verilerini oku
  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();
    
    // Maaşı ve deneyim süresini tam sayılara dönüştür
    int salary = int.parse(salaryStr!);
    int experience = int.parse(experienceStr!);
    
    // TODO: Her çalışan için iç içe geçmiş bir map yapısı oluştur ve dizine ekle
    
  }
  
  // Aranacak çalışan ID değerini oku
  String? lookupId = stdin.readLineSync();
  
  // TODO: Aşağıya şu işlemleri gerçekleştiren kodu yaz:
  // 1. Şirket adını ve çalışan dizinini görüntüle
  // 2. Belirli bir çalışanın bilgilerini bul ve görüntüle
  // 3. Departman istatistiklerini hesapla
  // 4. Ortalama maaşı hesapla
  // 5. Raporun tamamını istenen biçimde yazdır
  
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Mantık & Akış bölümündeki tüm dersler

Kendi başına pratik yap: Online Dart derleyicisi