שימוש ב-'.toList()'
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-Dart של Coddy. שיעור 12 מתוך 65.
כשמשתמשים בשיטות כמו map() ו־where() על רשימה, הן לא מחזירות List חדש — הן מחזירות Iterable. אף ש־Iterable מכיל את הנתונים שעברו טרנספורמציה או סינון, לעיתים קרובות צריך להמיר אותו בחזרה ל־List כדי להשתמש בשיטות ובמאפיינים המוכרים של רשימה.
השיטה .toList() ממירה Iterable בחזרה ל־List. ההמרה הזו יוצרת רשימה חדשה שמכילה את כל האיברים מהאיטרטור, וכך מאפשרת לך להשתמש בכל פעולות הרשימה הסטנדרטיות שהתרגלת אליהן.
List<String> words = ['apple', 'banana', 'cherry', 'date'];
// where() מחזירה Iterable, ולא List
var longWordsIterable = words.where((word) => word.length > 5);
// המר את ה-Iterable ל-List
List<String> longWordsList = longWordsIterable.toList();
print(longWordsList); // ['banana', 'cherry']שלב ההמרה הזה חיוני כשצריך לבצע פעולות נוספות על רשימה של נתונים שסוננו או עברו שינוי. בלי .toList(), תעבדו עם Iterable, שהפונקציונליות שלו מוגבלת יותר מזו של List מלאה.
אתגר
קלצרו תוכנית שמנהלת מערכת להמלצה על ספרים בספרייה באמצעות סינון ספרים לפי העדפות ז'אנר והמרת התוצאות לפורמט של רשימה תקינה. התוכנית שלכם צריכה:
- לקרוא קלט מסוג מחרוזת שמייצג את שם הספרייה
- לקרוא כמה קלטים מסוג מחרוזת שמייצגים את שמות הספרים (הקלט יסתיים כשתתקבל מחרוזת ריקה)
- לקרוא כמה קלטים מסוג מחרוזת שמייצגים את הז'אנרים של הספרים, בהתאמה לכל כותר (הקלט יסתיים כשתתקבל מחרוזת ריקה)
- לקרוא קלט מסוג מחרוזת שמייצג את הז'אנר המועדף לסינון
- להשתמש בשיטה
where()כדי לסנן ספרים שתואמים לז'אנר המועדף - להשתמש בשיטה
toList()כדי להמיר את האיטרטור המסונן לרשימה תקינה - להדפיס את תוצאות ההמלצות בפורמט המדויק שמוצג למטה
לדוגמה, אם שם הספרייה הוא "City Library", הספרים הם "The Great Gatsby", "Dune", "Pride and Prejudice", "1984", הז'אנרים הם "Fiction", "Science Fiction", "Romance", "Fiction", והז'אנר המועדף הוא "Fiction", התוכנית שלכם צריכה להפיק את הפלט הבא:
Library: City Library
All books: [The Great Gatsby, Dune, Pride and Prejudice, 1984]
All genres: [Fiction, Science Fiction, Romance, Fiction]
Filtering by genre: Fiction
Filtered books (iterable): (The Great Gatsby, 1984)
Recommended books (list): [The Great Gatsby, 1984]
Total recommendations: 2
Status: Recommendations readyאם שם הספרייה הוא "School Library", הספרים הם "Harry Potter", "Lord of the Rings", הז'אנרים הם "Fantasy", "Fantasy", והז'אנר המועדף הוא "Mystery", התוכנית שלכם צריכה להפיק את הפלט הבא:
Library: School Library
All books: [Harry Potter, Lord of the Rings]
All genres: [Fantasy, Fantasy]
Filtering by genre: Mystery
Filtered books (iterable): ()
Recommended books (list): []
Total recommendations: 0
Status: Recommendations readyאם שם הספרייה הוא "Community Library", הספרים הם "To Kill a Mockingbird", הז'אנרים הם "Classic", והז'אנר המועדף הוא "Classic", התוכנית שלכם צריכה להפיק את הפלט הבא:
Library: Community Library
All books: [To Kill a Mockingbird]
All genres: [Classic]
Filtering by genre: Classic
Filtered books (iterable): (To Kill a Mockingbird)
Recommended books (list): [To Kill a Mockingbird]
Total recommendations: 1
Status: Recommendations readyהתוכנית שלכם חייבת להשתמש בשיטה where() כדי לסנן ספרים על ידי התאמת הז'אנר שלהם לז'אנר המועדף, ואז להשתמש בשיטה toList() כדי להמיר את האיטרטור שנוצר לרשימה. יש להציג את האיטרטור המסונן בתוך סוגריים עגולים, ואילו את הרשימה הסופית יש להציג בתוך סוגריים מרובעים.
נסו בעצמכם
import 'dart:io';
void main() {
// קראו את שם הספרייה
String? libraryName = stdin.readLineSync();
// קראו את שמות הספרים עד למחרוזת ריקה
List<String> books = [];
while (true) {
String? book = stdin.readLineSync();
if (book == null || book.isEmpty) break;
books.add(book);
}
// קראו את סוגות הספרים עד למחרוזת ריקה
List<String> genres = [];
while (true) {
String? genre = stdin.readLineSync();
if (genre == null || genre.isEmpty) break;
genres.add(genre);
}
// קראו את הסוגה המועדפת
String? preferredGenre = stdin.readLineSync();
// TODO: כתבו את הקוד שלכם למטה
// השתמשו במתודה where() כדי לסנן ספרים לפי הסוגה המועדפת
// השתמשו במתודה toList() כדי להמיר את האוסף הניתן לאיטרציה שסונן לרשימה
// הדפיסו את התוצאות בפורמט הנדרש
print('Library: $libraryName');
print('All books: $books');
print('All genres: $genres');
print('Filtering by genre: $preferredGenre');
// הדפיסו את הספרים שסוננו (אוסף הניתן לאיטרציה) ואת הספרים המומלצים (רשימה)
// הדפיסו את מספר ההמלצות הכולל ואת הסטטוס
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
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 אונליין