Menu
CoddyTech

الـ Maps المتداخلة

جزء من قسم المنطق وتدفق التنفيذ في رحلة Dart على Coddy. الدرس 31 من 65.

أحيانًا تحتاج إلى تنظيم البيانات ضمن بنية هرمية أكثر تعقيدًا من مجرد زوج مفتاح وقيمة. تتيح لك الخرائط المتداخلة تخزين الخرائط كقيم داخل خرائط أخرى، ما ينشئ مستويات متعددة لتنظيم البيانات.

الخريطة المتداخلة هي ببساطة Map تكون قيمها نفسها كائنات Map. هذا الهيكل مثالي لتمثيل البيانات التي تحتوي على فئات وفئات فرعية، مثل ملفات تعريف المستخدمين التي تتضمن تفاصيل متعددة، أو كتالوجات المنتجات ذات السمات المتنوعة.

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

للوصول إلى البيانات في خريطة متداخلة، تستخدم عدة أقواس مربعة. تصل المجموعة الأولى إلى المفتاح في الخريطة الخارجية، وتصل المجموعة الثانية إلى المفتاح في الخريطة الداخلية. يُرجع البحث في الخريطة null عندما يكون المفتاح مفقودًا، لذا يحتاج Dart إلى ! بعد البحث الأول عندما تعرف أن المفتاح موجود: userProfiles['alice']!['email']. تسهّل هذه البنية ذات المستويين تجميع المعلومات المترابطة معًا مع إبقائها منظّمة وسهلة الوصول.

challenge icon

التحدي

سهل

أنشئ برنامجًا يدير نظام دليل موظفي شركة باستخدام خرائط متداخلة لتخزين معلومات مفصلة عن الموظفين. يجب أن يقوم برنامجك بما يلي:

  1. قراءة مُدخل نصي يمثّل اسم الشركة
  2. قراءة مجموعات متعددة من المُدخلات التي تمثّل بيانات الموظفين (سينتهي الإدخال عند استلام "employees_done"). سيكون لكل موظف:
    • معرّف الموظف (نص)
    • الاسم (نص)
    • القسم (نص)
    • الراتب (نص يجب تحويله إلى عدد صحيح)
    • سنوات الخبرة (نص يجب تحويله إلى عدد صحيح)
  3. قراءة مُدخل نصي يمثّل معرّف الموظف المطلوب البحث عنه
  4. إنشاء خريطة متداخلة تكون فيها معرّفات الموظفين مفاتيح، وتكون القيمة خريطة أخرى تحتوي على تفاصيل الموظف
  5. الوصول إلى معلومات موظف محدد وعرضها باستخدام الوصول إلى الخرائط المتداخلة
  6. حساب إحصاءات الأقسام وطباعة تقرير دليل الموظفين بالتنسيق الدقيق الموضح أدناه

على سبيل المثال، إذا كان اسم الشركة هو "TechCorp Solutions"، وكانت بيانات الموظفين تتضمن "EMP001" واسمه "Alice Johnson"، وقسمه "Engineering"، وراتبه 75000، وخبرته 5، و"EMP002" واسمه "Bob Smith"، وقسمه "Marketing"، وراتبه 60000، وخبرته 3، و"EMP003" واسمه "Carol Davis"، وقسمه "Engineering"، وراتبه 80000، وخبرته 7، وكان معرّف الموظف المطلوب البحث عنه هو "EMP001"، فيجب أن يكون ناتج برنامجك:

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

إذا كان اسم الشركة هو "Global Industries"، وكانت بيانات الموظفين تتضمن "E100" واسمه "David Wilson"، وقسمه "Sales"، وراتبه 55000، وخبرته 4، و"E101" واسمه "Emma Brown"، وقسمه "HR"، وراتبه 65000، وخبرته 6، وكان معرّف الموظف المطلوب البحث عنه هو "E101"، فيجب أن يكون ناتج برنامجك:

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

إذا كان اسم الشركة هو "StartupHub"، وكانت بيانات الموظفين تتضمن "S001" واسمه "Frank Miller"، وقسمه "Development"، وراتبه 70000، وخبرته 2، و"S002" واسمه "Grace Lee"، وقسمه "Design"، وراتبه 58000، وخبرته 3، و"S003" واسمه "Henry Chen"، وقسمه "Development"، وراتبه 72000، وخبرته 4، و"S004" واسمه "Ivy Taylor"، وقسمه "Marketing"، وراتبه 62000، وخبرته 5، وكان معرّف الموظف المطلوب البحث عنه هو "S003"، فيجب أن يكون ناتج برنامجك:

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

يجب أن ينشئ برنامجك بنية خريطة متداخلة، بحيث تستخدم الخريطة الخارجية معرّفات الموظفين مفاتيح، وتكون كل قيمة خريطة داخلية تحتوي على "name" و"department" و"salary" و"experience" مفاتيح. استخدم الوصول إلى الخرائط المتداخلة باستخدام أقواس مربعة مزدوجة لاسترداد معلومات موظف محدد. احسب عدد الموظفين في كل قسم، واحسب متوسط الراتب بقسمة مجموع الرواتب على عدد الموظفين. سيكون تنسيق الإدخال كما يلي: اسم الشركة، ثم مجموعات من خمس قيم (معرّف الموظف، الاسم، القسم، الراتب، الخبرة) تنتهي بـ "employees_done"، يليها معرّف الموظف المطلوب البحث عنه.

جرّب بنفسك

import 'dart:io';

void main() {
  // اقرأ اسم الشركة
  String? companyName = stdin.readLineSync();
  
  // هيّئ خريطة متداخلة لدليل الموظفين
  Map<String, Map<String, dynamic>> employeeDirectory = {};
  
  // اقرأ بيانات الموظفين حتى "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();
    
    // حوّل الراتب وسنوات الخبرة إلى أعداد صحيحة
    int salary = int.parse(salaryStr!);
    int experience = int.parse(experienceStr!);
    
    // TODO: أنشئ بنية خريطة متداخلة لكل موظف وأضفها إلى الدليل
    
  }
  
  // اقرأ معرّف الموظف للبحث عنه
  String? lookupId = stdin.readLineSync();
  
  // TODO: اكتب شيفرتك أدناه من أجل:
  // 1. عرض اسم الشركة ودليل الموظفين
  // 2. البحث عن معلومات موظف محدد وعرضها
  // 3. حساب إحصاءات الأقسام
  // 4. حساب متوسط الراتب
  // 5. طباعة التقرير الكامل بالتنسيق المطلوب
  
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس المنطق وتدفق التنفيذ

تدرّب بنفسك: مترجم Dart عبر الإنترنت