İç İç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.
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:
- Şirket adını temsil eden bir dizge girdisi oku
- Ç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)
- Aranacak çalışan kimliğini temsil eden bir dizge girdisi oku
- 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
- İç içe eşleme erişimini kullanarak belirli çalışan bilgilerine eriş ve bunları görüntüle
- 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 successfullyProgramı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
}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 ListesiKendi başına pratik yap: Online Dart derleyicisi