Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

خصائص الـ Map: keys و values

جزء من قسم Logic & Flow في رحلة Dart على Coddy — الدرس 28 من 65.

عند العمل مع مجموعات Map، تحتاج أحياناً إلى استخراج جميع المفاتيح أو جميع القيم بشكل منفصل. توفر Dart خاصيتين مريحتين لهذا الغرض: .keys و .values.

تعيد الخاصية .keys كائناً قابلاً للتكرار (iterable) يحتوي على جميع المفاتيح من الخريطة (map)، بينما تعيد .values كائناً قابلاً للتكرار يحتوي على جميع القيم المقابلة. تعد هذه الخصائص مفيدة بشكل خاص عندما تحتاج إلى معالجة المفاتيح والقيم بشكل مستقل.

Map<String, double> inventory = {
  'Laptop': 999.99,
  'Mouse': 25.50,
  'Keyboard': 75.00
};

Iterable<String> productNames = inventory.keys;
Iterable<double> prices = inventory.values;

print(productNames);  // (Laptop, Mouse, Keyboard)
print(prices);        // (999.99, 25.5, 75.0)

بما أن هذه الخصائص تُرجع عناصر قابلة للتكرار (iterables) بدلاً من القوائم، يمكنك تحويلها إلى قوائم باستخدام .toList() إذا كنت بحاجة إلى وظائف خاصة بالقوائم. هذا الفصل بين المفاتيح والقيم مفيد بشكل خاص عندما تحتاج إلى تحليل أو معالجة جانب واحد من بياناتك بشكل مستقل عن الآخر.

challenge icon

التحدي

سهل

قم بإنشاء برنامج يدير نظام مكتبة رقمية من خلال تحليل مجموعات الكتب واستخراج معلومات حول العناوين وسنوات نشرها. يجب على برنامجك القيام بما يلي:

  1. قراءة مدخل نصي (string) يمثل اسم المكتبة
  2. قراءة أزواج متعددة من المدخلات تمثل عناوين الكتب وسنوات نشرها (سينتهي الإدخال عندما تتلقى "catalog_done")
  3. إنشاء Map لتخزين كل عنوان كتاب كمفتاح (key) وسنة نشره كقيمة (value)
  4. استخدام خاصية .keys لاستخراج جميع عناوين الكتب وتحويلها إلى List
  5. استخدام خاصية .values لاستخراج جميع سنوات النشر وتحويلها إلى List
  6. العثور على أقدم كتاب من خلال تحديد الحد الأدنى للسنة من القيم
  7. العثور على أحدث كتاب من خلال تحديد الحد الأقصى للسنة من القيم
  8. طباعة تحليل المكتبة بالتنسيق الدقيق الموضح أدناه

على سبيل المثال، إذا كان اسم المكتبة هو "Central Library" وتضمن الكتالوج "To Kill a Mockingbird" مع سنة 1960، و "1984" مع سنة 1949، و "The Great Gatsby" مع سنة 1925، و "Harry Potter" مع سنة 1997، فيجب أن يخرج برنامجك ما يلي:

Library: Central Library
Book Collection Analysis:
All book titles: [To Kill a Mockingbird, 1984, The Great Gatsby, Harry Potter]
All publication years: [1960, 1949, 1925, 1997]
Total books in collection: 4
Oldest book year: 1925
Newest book year: 1997
Collection span: 72 years
Status: Library catalog analysis completed

إذا كان اسم المكتبة هو "University Library" وتضمن الكتالوج "Pride and Prejudice" مع سنة 1813، و "Moby Dick" مع سنة 1851، و "Brave New World" مع سنة 1932، فيجب أن يخرج برنامجك ما يلي:

Library: University Library
Book Collection Analysis:
All book titles: [Pride and Prejudice, Moby Dick, Brave New World]
All publication years: [1813, 1851, 1932]
Total books in collection: 3
Oldest book year: 1813
Newest book year: 1932
Collection span: 119 years
Status: Library catalog analysis completed

إذا كان اسم المكتبة هو "Community Library" وتضمن الكتالوج "The Hobbit" مع سنة 1937، و "Dune" مع سنة 1965، و "Neuromancer" مع سنة 1984، و "The Martian" مع سنة 2011، و "Klara and the Sun" مع سنة 2021، فيجب أن يخرج برنامجك ما يلي:

Library: Community Library
Book Collection Analysis:
All book titles: [The Hobbit, Dune, Neuromancer, The Martian, Klara and the Sun]
All publication years: [1937, 1965, 1984, 2011, 2021]
Total books in collection: 5
Oldest book year: 1937
Newest book year: 2021
Collection span: 84 years
Status: Library catalog analysis completed

يجب أن يستخدم برنامجك خاصية .keys لاستخراج جميع عناوين الكتب وخاصية .values لاستخراج جميع سنوات النشر. قم بتحويل كلا النوعين القابلين للتكرار (iterables) إلى Lists باستخدام .toList(). احسب مدى المجموعة (collection span) عن طريق طرح أقدم سنة من أحدث سنة. سيكون تنسيق الإدخال هو: اسم المكتبة، ثم عناوين الكتب وسنوات النشر بالتناوب (كسلاسل نصية تحتاج إلى تحويلها إلى أعداد صحيحة)، وينتهي بـ "catalog_done".

ورقة مرجعية

استخدم .keys لاستخراج جميع المفاتيح من Map و .values لاستخراج جميع القيم:

Map<String, double> inventory = {
  'Laptop': 999.99,
  'Mouse': 25.50,
  'Keyboard': 75.00
};

Iterable<String> productNames = inventory.keys;
Iterable<double> prices = inventory.values;

print(productNames);  // (Laptop, Mouse, Keyboard)
print(prices);        // (999.99, 25.5, 75.0)

قم بتحويل الـ iterables إلى قوائم باستخدام .toList() للحصول على الوظائف الخاصة بالقوائم:

List<String> namesList = inventory.keys.toList();
List<double> pricesList = inventory.values.toList();

جرّب بنفسك

import 'dart:io';

void main() {
  // قراءة اسم المكتبة
  String? libraryName = stdin.readLineSync();
  
  // إنشاء Map لتخزين عناوين الكتب وسنوات النشر
  Map<String, int> bookCatalog = {};
  
  // قراءة عناوين الكتب والسنوات حتى "catalog_done"
  while (true) {
    String? input = stdin.readLineSync();
    if (input == "catalog_done") {
      break;
    }
    String bookTitle = input!;
    String? yearInput = stdin.readLineSync();
    int publicationYear = int.parse(yearInput!);
    bookCatalog[bookTitle] = publicationYear;
  }
  
  // TODO: اكتب الكود الخاص بك أدناه
  // استخراج عناوين الكتب باستخدام خاصية .keys وتحويلها إلى List
  // استخراج سنوات النشر باستخدام خاصية .values وتحويلها إلى List
  // العثور على أقدم وأحدث السنوات
  // حساب مدى المجموعة
  // طباعة تحليل المكتبة بالتنسيق المطلوب
  
  print("Library: $libraryName");
  print("Book Collection Analysis:");
  // أضف عبارات الإخراج الخاصة بك هنا
}
quiz iconاختبر نفسك

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

جميع دروس Logic & Flow