خصائص الـ 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() إذا كنت بحاجة إلى وظائف خاصة بالقوائم. هذا الفصل بين المفاتيح والقيم مفيد بشكل خاص عندما تحتاج إلى تحليل أو معالجة جانب واحد من بياناتك بشكل مستقل عن الآخر.
التحدي
سهلقم بإنشاء برنامج يدير نظام مكتبة رقمية من خلال تحليل مجموعات الكتب واستخراج معلومات حول العناوين وسنوات نشرها. يجب على برنامجك القيام بما يلي:
- قراءة مدخل نصي (string) يمثل اسم المكتبة
- قراءة أزواج متعددة من المدخلات تمثل عناوين الكتب وسنوات نشرها (سينتهي الإدخال عندما تتلقى
"catalog_done") - إنشاء Map لتخزين كل عنوان كتاب كمفتاح (key) وسنة نشره كقيمة (value)
- استخدام خاصية
.keysلاستخراج جميع عناوين الكتب وتحويلها إلى List - استخدام خاصية
.valuesلاستخراج جميع سنوات النشر وتحويلها إلى List - العثور على أقدم كتاب من خلال تحديد الحد الأدنى للسنة من القيم
- العثور على أحدث كتاب من خلال تحديد الحد الأقصى للسنة من القيم
- طباعة تحليل المكتبة بالتنسيق الدقيق الموضح أدناه
على سبيل المثال، إذا كان اسم المكتبة هو "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:");
// أضف عبارات الإخراج الخاصة بك هنا
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1التعامل المتقدم مع القوائم
خصائص القائمة: first و lastحالة القائمة: isEmpty و isNotEmptyعكس القائمةالإضافة إلى القائمة: insertالحذف من القائمة: removeWhereالبحث في القائمة: indexOfفرز القائمةخلط القائمةملخص - منظم القوائم4معالجة الـ Map المتقدمة
التكرار عبر الـ Mapالتحقق من المفاتيح والقيمخصائص الـ Map: keys و valuesإضافة مشروطة: putIfAbsentإزالة العناصر من الـ Mapالـ Maps المتداخلةمراجعة - تحديث المخزون2عمليات القوائم الوظيفية
التحويل باستخدام 'map'التصفية باستخدام 'where'استخدام '.toList()'التحقق من الشروط باستخدام 'any'الشروط باستخدام 'every'البحث باستخدام 'firstWhere'مراجعة - تصفية البيانات5مشروع: حاسبة عربة التسوق
إعداد المشروعإضافة العناصر إلى العربة3المجموعات
ما هي المجموعة؟إنشاء مجموعةالإضافة والحذف من المجموعاتالتحقق من وجود عناصر في المجموعةتحويل قائمة إلى مجموعةاتحاد المجموعاتتقاطع المجموعاتالفرق بين المجموعاتمراجعة - قائمة ضيوف فريدة