Menu
CoddyTech

Map Bersarang

Termasuk bagian Logika dan Alur dalam perjalanan Dart di Coddy. Pelajaran 31 dari 65.

Terkadang kamu perlu mengatur data dalam struktur hierarkis yang lebih kompleks daripada pasangan kunci-nilai sederhana. Map bersarang memungkinkan kamu menyimpan map sebagai nilai di dalam map lain, sehingga menciptakan beberapa tingkat pengaturan data.

Map bersarang adalah Map yang nilainya berupa object Map. Struktur ini sangat cocok untuk merepresentasikan data yang memiliki kategori dan subkategori, seperti profil pengguna dengan beberapa detail atau katalog produk dengan berbagai atribut.

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

Untuk mengakses data dalam map bertingkat, kamu menggunakan beberapa tanda kurung siku. Pasangan pertama mengakses kunci map luar, dan pasangan kedua mengakses kunci map dalam. Struktur dua tingkat ini memudahkan kamu mengelompokkan informasi terkait sambil tetap membuatnya tertata dan mudah diakses.

challenge icon

Tantangan

Mudah

Buat program yang mengelola sistem direktori karyawan perusahaan menggunakan map bertingkat untuk menyimpan informasi karyawan yang terperinci. Programmu harus:

  1. Membaca input string yang mewakili nama perusahaan
  2. Membaca beberapa kumpulan input yang mewakili data karyawan (input akan berakhir saat kamu menerima "employees_done"). Setiap karyawan memiliki:
    • ID karyawan (string)
    • Nama (string)
    • Departemen (string)
    • Gaji (string yang perlu dikonversi menjadi integer)
    • Tahun pengalaman (string yang perlu dikonversi menjadi integer)
  3. Membaca input string yang mewakili ID karyawan yang akan dicari
  4. Membuat Map bertingkat dengan ID setiap karyawan sebagai key, dan nilainya berupa Map lain yang berisi detail karyawan
  5. Mengakses dan menampilkan informasi karyawan tertentu menggunakan akses map bertingkat
  6. Menghitung statistik departemen dan mencetak laporan direktori karyawan dengan format persis seperti yang ditunjukkan di bawah

Misalnya, jika nama perusahaan adalah "TechCorp Solutions", data karyawan mencakup "EMP001" dengan nama "Alice Johnson", departemen "Engineering", gaji 75000, pengalaman 5, "EMP002" dengan nama "Bob Smith", departemen "Marketing", gaji 60000, pengalaman 3, "EMP003" dengan nama "Carol Davis", departemen "Engineering", gaji 80000, pengalaman 7, dan ID karyawan yang akan dicari adalah "EMP001", programmu harus menghasilkan output:

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

Jika nama perusahaan adalah "Global Industries", data karyawan mencakup "E100" dengan nama "David Wilson", departemen "Sales", gaji 55000, pengalaman 4, "E101" dengan nama "Emma Brown", departemen "HR", gaji 65000, pengalaman 6, dan ID karyawan yang akan dicari adalah "E101", programmu harus menghasilkan output:

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

Jika nama perusahaan adalah "StartupHub", data karyawan mencakup "S001" dengan nama "Frank Miller", departemen "Development", gaji 70000, pengalaman 2, "S002" dengan nama "Grace Lee", departemen "Design", gaji 58000, pengalaman 3, "S003" dengan nama "Henry Chen", departemen "Development", gaji 72000, pengalaman 4, "S004" dengan nama "Ivy Taylor", departemen "Marketing", gaji 62000, pengalaman 5, dan ID karyawan yang akan dicari adalah "S003", programmu harus menghasilkan output:

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

Programmu harus membuat struktur Map bertingkat dengan map luar menggunakan ID karyawan sebagai key, dan setiap nilai berupa map dalam yang menggunakan "name", "department", "salary", dan "experience" sebagai key. Gunakan akses map bertingkat dengan tanda kurung siku ganda untuk mengambil informasi karyawan tertentu. Hitung jumlah karyawan per departemen dan hitung gaji rata-rata dengan membagi total gaji dengan jumlah karyawan. Format inputnya adalah: nama perusahaan, lalu kumpulan lima nilai (ID karyawan, nama, departemen, gaji, pengalaman) yang diakhiri dengan "employees_done", lalu ID karyawan yang akan dicari.

Coba sendiri

import 'dart:io';

void main() {
  // Baca nama perusahaan
  String? companyName = stdin.readLineSync();
  
  // Inisialisasi map bersarang untuk direktori karyawan
  Map<String, Map<String, dynamic>> employeeDirectory = {};
  
  // Baca data karyawan hingga "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();
    
    // Ubah gaji dan pengalaman menjadi bilangan bulat
    int salary = int.parse(salaryStr!);
    int experience = int.parse(experienceStr!);
    
    // TODO: Buat struktur map bersarang untuk setiap karyawan dan tambahkan ke direktori
    
  }
  
  // Baca ID karyawan yang ingin dicari
  String? lookupId = stdin.readLineSync();
  
  // TODO: Tulis kodemu di bawah ini untuk:
  // 1. Tampilkan nama perusahaan dan direktori karyawan
  // 2. Cari dan tampilkan informasi karyawan tertentu
  // 3. Hitung statistik departemen
  // 4. Hitung rata-rata gaji
  // 5. Cetak laporan lengkap dalam format yang diminta
  
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Logika dan Alur

Latihan sendiri: Compiler Dart online