טרנספורמציה באמצעות 'map'
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-Dart של Coddy. שיעור 10 מתוך 65.
כשצריך להפוך כל איבר ברשימה למשהו חדש, Dart מספקת את המתודה העוצמתית map(). המתודה הזאת מחילה פונקציית טרנספורמציה על כל איבר ברשימה ומייצרת Iterable עצל חדש של התוצאות שעברו טרנספורמציה (יש לקרוא ל־.toList() כדי לקבל רשימה).
המתודה map() מקבלת פונקציה כפרמטר, שמגדירה כיצד יש לשנות כל איבר. הפונקציה מקבלת כל איבר מהרשימה המקורית ומחזירה את הגרסה שעברה שינוי. לאחר מכן, המתודה map() אוספת את כל הערכים שעברו שינוי לרשימה חדשה.
List<int> numbers = [1, 2, 3, 4, 5];
// הכפילו כל מספר כדי לשנות אותו
var doubled = numbers.map((number) => number * 2);
print(doubled); // (2, 4, 6, 8, 10)הגישה הזו אלגנטית הרבה יותר מיצירה ידנית של רשימה חדשה ושימוש בלולאה כדי לשנות כל איבר. המתודה map() מייצגת מושג יסודי בתכנות פונקציונלי, ומאפשרת לך לבטא טרנספורמציות של נתונים בצורה ברורה ותמציתית.
אתגר
קלצרו תוכנית שמנהלת מערכת תמחור מוצרים על ידי החלת התאמות מחיר המבוססות על אחוזים על כל הפריטים במלאי של חנות. התוכנית שלכם צריכה:
- לקרוא קלט מסוג מחרוזת שמייצג את שם החנות
- לקרוא כמה קלטים עשרוניים שמייצגים את המחירים המקוריים של המוצרים (הקלט יסתיים כשתקבלו
-1) - לקרוא קלט עשרוני שמייצג את התאמת האחוזים (חיובית להעלאת מחיר, שלילית להנחה)
- להשתמש בשיטה
map()כדי לשנות כל מחיר באמצעות החלת התאמת האחוזים - להדפיס את תוצאות התאמת המחירים בדיוק בפורמט שמוצג למטה
לדוגמה, אם שם החנות הוא "Tech Store", המחירים הם 99.99, 149.50, 79.99, 199.99, והתאמת האחוזים היא 15.0 (עלייה של 15%), התוכנית שלכם צריכה להפיק את הפלט הבא:
Store: Tech Store
Original prices: [99.99, 149.5, 79.99, 199.99]
Applying 15.0% adjustment
Adjusted prices: (114.9885, 171.925, 91.9885, 229.9885)
Total items processed: 4
Status: Price adjustment completedאם שם החנות הוא "Fashion Outlet", המחירים הם 29.99, 45.00, והתאמת האחוזים היא -20.0 (הנחה של 20%), התוכנית שלכם צריכה להפיק את הפלט הבא:
Store: Fashion Outlet
Original prices: [29.99, 45.0]
Applying -20.0% adjustment
Adjusted prices: (23.992, 36.0)
Total items processed: 2
Status: Price adjustment completedאם שם החנות הוא "Book Corner" וסופק רק מחיר אחד, 12.50, עם התאמת אחוזים 0.0, התוכנית שלכם צריכה להפיק את הפלט הבא:
Store: Book Corner
Original prices: [12.5]
Applying 0.0% adjustment
Adjusted prices: (12.5)
Total items processed: 1
Status: Price adjustment completedהתוכנית שלכם חייבת להשתמש בשיטה map() עם פונקציית המרה שמחשבת את המחיר החדש לפי הנוסחה: originalPrice * (1 + percentage / 100). השיטה map() צריכה להחזיר אוסף איטרטיבי שמכיל את כל המחירים לאחר ההתאמה, שיוצגו בפורמט עם סוגריים.
נסו בעצמכם
import 'dart:io';
void main() {
// קראו את שם החנות
String? storeName = stdin.readLineSync();
// קראו מחירים עד שמתקבל -1
List<double> prices = [];
while (true) {
String? input = stdin.readLineSync();
double price = double.parse(input!);
if (price == -1) {
break;
}
prices.add(price);
}
// קראו את ההתאמה באחוזים
String? adjustmentInput = stdin.readLineSync();
double adjustment = double.parse(adjustmentInput!);
// TODO: כתבו את הקוד שלכם למטה
// השתמשו במתודה map() כדי להחיל את ההתאמה באחוזים על כל המחירים
// נוסחה: originalPrice * (1 + percentage / 100)
// הציגו את התוצאות
print('Store: $storeName');
print('Original prices: $prices');
print('Applying $adjustment% adjustment');
// הדפיסו את המחירים המותאמים בפורמט של סוגריים
// הדפיסו את מספר הפריטים הכולל שעובדו
// הדפיסו הודעת סטטוס
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
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 אונליין