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

الحذف من القائمة: removeWhere

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

أحياناً تحتاج إلى إزالة عناصر متعددة من قائمة بناءً على شرط معين. بدلاً من إزالة العناصر واحداً تلو الآخر، توفر Dart طريقة removeWhere() التي يمكنها إزالة جميع العناصر التي تطابق شرط الاختبار في عملية واحدة.

تأخذ الطريقة removeWhere() دالة اختبار كمعامل لها. تستقبل هذه الدالة كل عنصر في القائمة وتعيد true إذا كان يجب إزالة العنصر، أو false إذا كان يجب أن يبقى. ثم تقوم الطريقة بإزالة جميع العناصر التي تعيد دالة الاختبار لها القيمة true.

List<int> numbers = [1, 2, 3, 4, 5, 6, 7, 8];

// إزالة جميع الأرقام الزوجية
numbers.removeWhere((number) => number % 2 == 0);

print(numbers);  // [1, 3, 5, 7]

هذا النهج أكثر كفاءة بكثير من البحث عن العناصر وإزالتها يدوياً بشكل فردي. تقوم الطريقة removeWhere() بتعديل القائمة الأصلية مباشرةً، مما يجعلها أداة قوية لتنظيف القوائم بناءً على أي شرط يمكنك التعبير عنه كاختبار منطقي (boolean).

challenge icon

التحدي

سهل

قم بإنشاء برنامج يدير نظام تصفية درجات الطلاب عن طريق إزالة الطلاب الراسبين من قائمة الفصل. يجب على برنامجك القيام بما يلي:

  1. قراءة مدخل نصي (string) يمثل اسم الفصل
  2. قراءة مدخلات صحيحة (integer) متعددة تمثل درجات الطلاب (سينتهي الإدخال عندما تتلقى -1)
  3. استخدام طريقة removeWhere() لإزالة جميع الدرجات التي تقل عن 60 (درجات الرسوب)
  4. طباعة نتائج تصفية الدرجات بالتنسيق الدقيق الموضح أدناه

على سبيل المثال، إذا كان اسم الفصل هو "Mathematics 101" والدرجات هي 85، 45، 92، 38، 76، 55، 88، يجب أن يخرج برنامجك ما يلي:

Class: Mathematics 101
Original scores: [85, 45, 92, 38, 76, 55, 88]
Removed failing scores (below 60)
Passing scores: [85, 92, 76, 88]
Students passed: 4
Students failed: 3

إذا كان اسم الفصل هو "History 201" وكانت جميع الدرجات ناجحة: 75، 82، 91، يجب أن يخرج برنامجك ما يلي:

Class: History 201
Original scores: [75, 82, 91]
Removed failing scores (below 60)
Passing scores: [75, 82, 91]
Students passed: 3
Students failed: 0

إذا كان اسم الفصل هو "Chemistry 301" وكانت جميع الدرجات راسبة: 45، 32، 58، يجب أن يخرج برنامجك ما يلي:

Class: Chemistry 301
Original scores: [45, 32, 58]
Removed failing scores (below 60)
Passing scores: []
Students passed: 0
Students failed: 3

يجب أن يستخدم برنامجك طريقة removeWhere() مع وظيفة اختبار (test function) تعيد true للدرجات التي تقل عن 60. يجب أن تقوم الطريقة بتعديل القائمة الأصلية عن طريق إزالة جميع درجات الرسوب، وترك درجات النجاح فقط.

ورقة مرجعية

تقوم الطريقة removeWhere() بإزالة كافة العناصر من القائمة التي تستوفي شرطاً معيناً. تأخذ هذه الطريقة دالة اختبار تُرجع true للعناصر المراد إزالتها و false للعناصر التي سيتم الاحتفاظ بها.

List<int> numbers = [1, 2, 3, 4, 5, 6, 7, 8];

// إزالة جميع الأرقام الزوجية
numbers.removeWhere((number) => number % 2 == 0);

print(numbers);  // [1, 3, 5, 7]

تقوم هذه الطريقة بتعديل القائمة الأصلية مباشرة، وهي أكثر كفاءة من إزالة العناصر كلٌ على حدة.

جرّب بنفسك

import 'dart:io';

void main() {
  // قراءة اسم الفصل
  String? className = stdin.readLineSync();
  
  // قراءة الدرجات حتى يتم إدخال -1
  List<int> scores = [];
  while (true) {
    int score = int.parse(stdin.readLineSync()!);
    if (score == -1) {
      break;
    }
    scores.add(score);
  }
  
  // تخزين الدرجات الأصلية للعرض
  List<int> originalScores = List.from(scores);
  
  // TODO: اكتب الكود الخاص بك أدناه
  // لإزالة الدرجات الأقل من 60 removeWhere() استخدم دالة
  
  // طباعة النتائج
  print('Class: $className');
  print('Original scores: $originalScores');
  print('Removed failing scores (below 60)');
  print('Passing scores: $scores');
  print('Students passed: ${scores.length}');
  print('Students failed: ${originalScores.length - scores.length}');
}
quiz iconاختبر نفسك

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

جميع دروس Logic & Flow