הסרת פריטים מרשימה: removeWhere
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-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() משנה ישירות את הרשימה המקורית, ולכן היא כלי רב עוצמה לניקוי רשימות על סמך כל תנאי שאפשר לנסח כמבחן בוליאני.
אתגר
קלצרו תוכנית שמנהלת מערכת לסינון ציוני תלמידים באמצעות הסרת התלמידים שנכשלו מרשימת הכיתה. התוכנית שלכם צריכה:
- לקרוא קלט מסוג מחרוזת שמייצג את שם הכיתה
- לקרוא כמה ערכי קלט שלמים שמייצגים את ציוני התלמידים (הקלט יסתיים כשתקבלו
-1) - להשתמש בשיטה
removeWhere()כדי להסיר את כל הציונים שמתחת ל־60 (ציוני נכשל) - להדפיס את תוצאות סינון הציונים בדיוק בפורמט שמוצג למטה
לדוגמה, אם שם הכיתה הוא "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() עם פונקציית בדיקה שמחזירה true עבור ציונים שמתחת ל־60. השיטה צריכה לשנות את הרשימה המקורית על ידי הסרת כל ציוני הנכשל, כך שיישארו בה רק ציוני המעבר.
נסו בעצמכם
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: כתבו את הקוד שלכם למטה
// השתמשו במתודה removeWhere() כדי להסיר ציונים נמוכים מ-60
// הדפיסו את התוצאות
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}');
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
1מניפולציות מתקדמות ברשימות
מאפייני רשימה: ראשון ואחרוןמצב הרשימה: isEmpty ו-isNotEmpהיפוך רשימההוספה לרשימה: insertהסרת פריטים מרשימה: removeWhereחיפוש ברשימה: indexOfמיון רשימהערבוב רשימהסיכום – מארגן רשימות4מניפולציה מתקדמת של Map
מעבר על Mapבדיקה אם מפתחות וערכים קיימיםמאפייני Map: מפתחות וערכיםהוספה מותנית: putIfAbsentהסרת רשומות מ־MapMaps מקונניםסיכום – עדכון מלאי2פעולות פונקציונליות על רשימות
טרנספורמציה באמצעות 'map'סינון באמצעות 'where'שימוש ב-'.toList()'בדיקת תנאים באמצעות 'any'תנאים באמצעות 'every'איתור באמצעות 'firstWhere'סיכום – סינון נתונים5פרויקט: חישוב עגלת קניות
הגדרת הפרויקטהוספת פריטים לעגלה3קבוצות
מהי קבוצה?יצירת קבוצההוספה והסרה מקבוצותבדיקת נוכחות של איברים בקבוצההמרת רשימה לקבוצהאיחוד קבוצותחיתוך קבוצותהפרש קבוצותסיכום – רשימת אורחים ייחודית6טיפול בסיסי בשגיאות
מהן חריגות?בלוק ה-try-catchתפיסת חריגות באמצעות onבלוק ה-finallyהשלכת חריגהסיכום – חלוקה בטוחה9טיפוסי מנייה (Enums)
מה הם Enums?הגדרת Enum פשוטשימוש ב-Enums במשתניםEnums במשפטי 'switch'סיכום – רמזורתרגלו בעצמכם: קומפיילר Dart אונליין