İç İç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.
Görev
KolayAyrı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:
- Şirket adını temsil eden bir dize (string) girdisi okuyun
- Ç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)
- Aranacak bir çalışan kimliğini temsil eden bir dize (string) girdisi okuyun
- 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
- İç içe geçmiş map erişimini kullanarak belirli çalışan bilgilerine erişin ve bunları görüntüleyin
- 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 successfullyEğ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 successfullyEğ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 successfullyProgramı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
}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
1İleri Düzey Liste İşlemleri
Liste Özellikleri: first & lastListe Durumu: isEmpty & isNotEmptyBir Listeyi Tersine ÇevirmeListeye Ekleme: insertListeden Silme: removeWhereListede Bulma: indexOfBir Listeyi SıralamaBir Listeyi KarıştırmaÖzet - Liste Düzenleyici4İleri Seviye Map İşlemleri
Map Üzerinde GezinmeAnahtar ve Değer KontrolüMap Özellikleri: keys & valuesKoşullu Ekleme: putIfAbsentMap'ten Öge Kaldırmaİç İçe Map'lerÖzet - Envanter Güncelleme7İleri Seviye Fonksiyonlar
Anonim FonksiyonlarFonksiyonları Argüman Olarak AktarmaClosure'ları AnlamakÖzyinelemeye GirişÖzyinelemeli Fonksiyon: Geri SayımÖzyinelemeli Fonksiyon: FaktöriyelÖzet - Liste İşleyici10Son Meydan Okumalar
Meydan Okuma: Not SıralayıcıMeydan Okuma: Sesli Harf SayacıMeydan Okuma: FizzBuzz2Fonksiyonel Liste İşlemleri
'map' ile Dönüştürme'where' ile Filtreleme'.toList()' Kullanımı'any' ile Koşul Kontrolü'every' ile Koşullar'firstWhere' ile BulmaÖzet - Veri Filtreleme5Proje: Alışveriş Sepeti Hesaplayıcı
Proje KurulumuSepete Ürün Ekleme3Kümeler
Küme Nedir?Küme OluşturmaKümelere Eleman Ekleme ve ÇıkarmaKüme İçinde Eleman KontrolüListeyi Kümeye DönüştürmeKüme BirleşimiKüme KesişimiKüme FarkıÖzet - Benzersiz Davetli Listesi