Menu
Coddy logo textTech

İç İç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ş eşlemeler (nested maps), eşlemeleri diğer eşlemelerin içinde değer olarak saklamanıza olanak tanıyarak birden fazla veri organizasyonu düzeyi oluşturmanızı sağlar.

İç içe geçmiş bir map, değerlerin kendilerinin Map nesneleri olduğu bir Map yapısıdır. Bu yapı, birden fazla detaya sahip kullanıcı profilleri veya çeşitli özniteliklere sahip ürün katalogları gibi kategorileri ve alt kategorileri olan verileri temsil etmek için mükemmeldir.

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 (nested map) verilere erişmek için birden fazla köşeli parantez kullanırsınız. İlk set dış eşlemenin anahtarına erişirken, ikinci set iç eşlemenin anahtarına erişir. Bu iki seviyeli yapı, ilgili bilgileri düzenli ve erişilebilir tutarken bir arada gruplandırmayı kolaylaştırır.

challenge icon

Görev

Kolay

Ayrıntılı çalışan bilgilerini depolamak için iç içe geçmiş map'leri (nested maps) kullanarak bir şirketin çalışan dizini sistemini yöneten bir program oluşturun. Programınız şunları yapmalıdır:

  1. Şirket adını temsil eden bir dize (string) girdisi okuyun
  2. Çalışan verilerini temsil eden birden fazla girdi kümesi okuyun (girdi "employees_done" değerini aldığınızda sona erecektir). Her çalışanın şunları olacaktır:
    • Çalışan Kimliği (string)
    • Ad (string)
    • Departman (string)
    • Maaş (tam sayıya dönüştürülmesi gereken string)
    • Deneyim yılı (tam sayıya dönüştürülmesi gereken string)
  3. Aranacak bir çalışan kimliğini temsil eden bir dize (string) girdisi okuyun
  4. Her çalışan kimliğinin bir anahtar (key) olduğu ve değerin (value) çalışanın ayrıntılarını içeren başka bir Map olduğu iç içe geçmiş bir Map oluşturun
  5. İç içe geçmiş map erişimini kullanarak belirli çalışan bilgilerine erişin ve bunları görüntüleyin
  6. Departman istatistiklerini hesaplayın ve çalışan dizini raporunu tam olarak aşağıda gösterilen formatta yazdırın

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

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

Eğer şirket adı "Global Industries" ise, çalışan verileri şunları içeriyorsa: adı "David Wilson", departmanı "Sales", maaşı 55000, deneyimi 4 olan "E100"; adı "Emma Brown", departmanı "HR", maaşı 65000, deneyimi 6 olan "E101" ve aranacak çalışan kimliği "E101" ise, programınızın çıktısı şöyle olmalıdır:

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

Eğer şirket adı "StartupHub" ise, çalışan verileri şunları içeriyorsa: adı "Frank Miller", departmanı "Development", maaşı 70000, deneyimi 2 olan "S001"; adı "Grace Lee", departmanı "Design", maaşı 58000, deneyimi 3 olan "S002"; adı "Henry Chen", departmanı "Development", maaşı 72000, deneyimi 4 olan "S003"; adı "Ivy Taylor", departmanı "Marketing", maaşı 62000, deneyimi 5 olan "S004" ve aranacak çalışan kimliği "S003" ise, programınızın çıktısı şöyle olmalıdır:

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ız, dış map'in çalışan kimliklerini anahtar olarak kullandığı ve her değerin "name", "department", "salary" ve "experience" anahtarlarını içeren bir iç map olduğu iç içe geçmiş bir Map yapısı oluşturmalıdır. Belirli çalışan bilgilerini almak için çift köşeli parantezlerle iç içe geçmiş map erişimini kullanın. Çalışanları departmana göre sayın ve toplam maaş toplamını çalışan sayısına bölerek ortalama maaşı hesaplayın. Girdi formatı şu şekilde olacaktır: şirket adı, ardından "employees_done" ile biten beşli değer kümeleri (çalışan kimliği, ad, departman, maaş, deneyim) ve ardından aranacak çalışan kimliği.

Kopya kağıdı

İç içe geçmiş map'ler, map'leri diğer map'lerin içinde değerler olarak saklamanıza olanak tanıyarak hiyerarşik veri yapıları oluşturmanızı sağlar:

Map<String, Map<String, dynamic>> userProfiles = {
  'alice': {
    'email': 'alice@example.com',
    'age': 28
  },
  'bob': {
    'email': 'bob@example.com',
    'age': 32
  }
};

Birden fazla köşeli parantez kullanarak iç içe geçmiş map verilerine erişin:

print(userProfiles['alice']['email']);  // alice@example.com
print(userProfiles['bob']['age']);      // 32

İlk parantez dıştaki map'in anahtarına erişir, ikinci parantez ise içteki map'in anahtarına erişir.

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" gelene 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 deneyimi tam sayıya 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ş map yapısını oluştur ve dizine ekle
    
  }
  
  // Aranacak çalışan kimliğini (ID) oku
  String? lookupId = stdin.readLineSync();
  
  // TODO: Aşağıdaki işlemleri yapmak için kodunuzu yazın:
  // 1. Şirket adını ve çalışan dizinini görüntüleyin
  // 2. Belirli bir çalışan bilgisini arayın ve görüntüleyin
  // 3. Departman istatistiklerini hesaplayın
  // 4. Ortalama maaşı hesaplayın
  // 5. Tam raporu istenen formatta yazdırın
  
}
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