البحث باستخدام 'firstWhere'
جزء من قسم Logic & Flow في رحلة Dart على Coddy — الدرس 15 من 65.
عندما تحتاج إلى العثور على عنصر محدد في قائمة يستوفي معايير معينة، توفر طريقة firstWhere() حلاً فعالاً. وعلى عكس طرق التصفية التي تعيد جميع العناصر المطابقة، تتوقف firstWhere() عن البحث بمجرد العثور على أول عنصر يستوفي شرطك.
تأخذ الطريقة firstWhere() وظيفة اختبار تُرجع true أو false لكل عنصر. وهي تفحص العناصر واحداً تلو الآخر حتى تجد العنصر الأول الذي يجتاز الاختبار، ثم تعيد ذلك العنصر على الفور.
List<int> numbers = [1, 3, 8, 15, 22, 7];
// البحث عن أول رقم زوجي
int firstEven = numbers.firstWhere((number) => number % 2 == 0);
print(firstEven); // 8في الحالات التي لا يتطابق فيها أي عنصر مع شرطك، يوفر firstWhere() معلمة orElse اختيارية. تقبل هذه المعلمة دالة تُرجع قيمة افتراضية عند عدم العثور على تطابق، مما يمنع برنامجك من التعطل بسبب خطأ.
التحدي
سهلقم بإنشاء برنامج يدير نظام خدمة العملاء من خلال العثور على أول شكوى عميل تتطلب اهتماماً فورياً. يجب على برنامجك القيام بما يلي:
- قراءة مدخل نصي (string) يمثل اسم القسم (department name)
- قراءة عدة مدخلات صحيحة (integers) تمثل مستويات أولوية الشكاوى (ينتهي الإدخال عندما تتلقى
-1) - قراءة مدخل صحيح (integer) يمثل حد الأولوية العاجلة (urgent priority threshold)
- استخدام التابع
firstWhere()للعثور على أول شكوى بمستوى أولوية أكبر من أو يساوي الحد العاجل - طباعة نتائج خدمة العملاء بالتنسيق الدقيق الموضح أدناه
على سبيل المثال، إذا كان اسم القسم هو "Technical Support"، ومستويات الأولوية هي 3، 7، 2، 9، 4، والحد العاجل هو 8، فيجب أن يخرج برنامجك ما يلي:
Department: Technical Support
All complaints: [3, 7, 2, 9, 4]
Urgent threshold: 8
Searching for first complaint >= 8
First urgent complaint: 9
Status: Urgent complaint found - immediate action requiredإذا كان اسم القسم هو "Billing Department"، ومستويات الأولوية هي 4، 6، 3، 5، والحد العاجل هو 7، فيجب أن يخرج برنامجك ما يلي:
Department: Billing Department
All complaints: [4, 6, 3, 5]
Urgent threshold: 7
Searching for first complaint >= 7
First urgent complaint: Not found
Status: No urgent complaints - continue normal processingإذا كان اسم القسم هو "Sales Support"، ومستويات الأولوية هي 10، 2، 8، والحد العاجل هو 9، فيجب أن يخرج برنامجك ما يلي:
Department: Sales Support
All complaints: [10, 2, 8]
Urgent threshold: 9
Searching for first complaint >= 9
First urgent complaint: 10
Status: Urgent complaint found - immediate action requiredيجب أن يستخدم برنامجك التابع firstWhere() للعثور على أول أولوية شكوى أكبر من أو تساوي الحد العاجل. إذا لم يتم العثور على شكوى عاجلة، فاعرض "Not found" للشكوى العاجلة الأولى واعرض "No urgent complaints - continue normal processing" كحالة (status). إذا تم العثور على شكوى عاجلة، فاعرض مستوى الأولوية واعرض "Urgent complaint found - immediate action required" كحالة.
ورقة مرجعية
تبحث طريقة firstWhere() عن العنصر الأول في قائمة يستوفي شرطًا معينًا. وتتوقف عن البحث بمجرد العثور على تطابق وتعيد ذلك العنصر.
List<int> numbers = [1, 3, 8, 15, 22, 7];
// البحث عن أول رقم زوجي
int firstEven = numbers.firstWhere((number) => number % 2 == 0);
print(firstEven); // 8استخدم المعامل orElse لتوفير قيمة افتراضية عندما لا يتطابق أي عنصر مع الشرط:
// إرجاع قيمة افتراضية في حال عدم العثور على تطابق
int result = numbers.firstWhere(
(number) => number > 100,
orElse: () => -1
);جرّب بنفسك
import 'dart:io';
void main() {
// قراءة اسم القسم
String? department = stdin.readLineSync();
// قراءة مستويات أولوية الشكاوى حتى -1
List<int> complaints = [];
while (true) {
int priority = int.parse(stdin.readLineSync()!);
if (priority == -1) break;
complaints.add(priority);
}
// قراءة حد الاستعجال
int urgentThreshold = int.parse(stdin.readLineSync()!);
// TODO: اكتب الكود الخاص بك أدناه
// للعثور على أول شكوى >= urgentThreshold استخدم الدالة firstWhere()
// طباعة النتائج
print('Department: $department');
print('All complaints: $complaints');
print('Urgent threshold: $urgentThreshold');
print('Searching for first complaint >= $urgentThreshold');
// طباعة نتيجة أول شكوى عاجلة
// طباعة رسالة الحالة
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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المجموعات
ما هي المجموعة؟إنشاء مجموعةالإضافة والحذف من المجموعاتالتحقق من وجود عناصر في المجموعةتحويل قائمة إلى مجموعةاتحاد المجموعاتتقاطع المجموعاتالفرق بين المجموعاتمراجعة - قائمة ضيوف فريدة