המרת רשימה לקבוצה
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-Dart של Coddy. שיעור 21 מתוך 65.
אחד השימושים המעשיים ביותר של Set הוא הסרת איברים כפולים מתוך List. מכיוון שקבוצות מסירות כפילויות באופן אוטומטי, אפשר להמיר בקלות רשימה עם ערכים חוזרים לאוסף של איברים ייחודיים.
כדי להמיר List ל־Set, פשוט מעבירים את הרשימה לבנאי Set.from(). כך יוצרים קבוצה חדשה שמכילה את כל האיברים הייחודיים מהרשימה המקורית.
List<int> numbersWithDuplicates = [1, 2, 2, 3, 3, 3, 4, 5, 5];
Set<int> uniqueNumbers = Set.from(numbersWithDuplicates);
print(uniqueNumbers); // {1, 2, 3, 4, 5}אם צריך לקבל את התוצאה בחזרה כ־List (אולי כדי לשמור על תאימות לחלקים אחרים בקוד שלך), אפשר להמיר את הקבוצה בחזרה לרשימה באמצעות toList(). כך מתקבלת רשימה שמכילה רק את האיברים הייחודיים מהמקור.
List<int> uniqueList = Set.from(numbersWithDuplicates).toList();
print(uniqueList); // [1, 2, 3, 4, 5]התבנית הזו של List → Set → List נפוצה מאוד כשצריך לנקות נתונים באמצעות הסרת כפילויות, תוך שמירה על מבנה הרשימה להמשך עיבוד.
אתגר
קלצרו תוכנית שמנהלת מערכת לניקוי נתונים על ידי הסרת ערכים כפולים מתשובות לסקר. התוכנית שלכם צריכה:
- לקרוא קלט מסוג מחרוזת שמייצג את כותרת הסקר
- לקרוא כמה קלטים מסוג מחרוזת שמייצגים תשובות לסקר (הקלט יסתיים כשתקבלו
"responses_done") - ליצור List לאחסון כל התשובות המקוריות (כולל כפילויות)
- להשתמש ב-
Set.from()כדי להמיר את הרשימה ל-Set ולהסיר כפילויות באופן אוטומטי - להשתמש ב-
toList()כדי להמיר את ה-Set בחזרה ל-List של תשובות ייחודיות - להדפיס את תוצאות ניקוי הנתונים בפורמט המדויק שמוצג למטה
לדוגמה, אם כותרת הסקר היא "Customer Satisfaction Survey" והתשובות הן "Excellent", "Good", "Excellent", "Fair", "Good", "Excellent", "Poor", התוכנית שלכם צריכה להציג:
Survey: Customer Satisfaction Survey
Original responses: [Excellent, Good, Excellent, Fair, Good, Excellent, Poor]
Total responses collected: 7
Converting to Set to remove duplicates...
Unique responses (Set): {Excellent, Good, Fair, Poor}
Converting back to List...
Cleaned responses: [Excellent, Good, Fair, Poor]
Duplicates removed: 3
Final unique responses: 4
Status: Data cleaning completed successfullyאם כותרת הסקר היא "Product Feedback" והתשובות הן "Like", "Dislike", "Like", "Like", התוכנית שלכם צריכה להציג:
Survey: Product Feedback
Original responses: [Like, Dislike, Like, Like]
Total responses collected: 4
Converting to Set to remove duplicates...
Unique responses (Set): {Like, Dislike}
Converting back to List...
Cleaned responses: [Like, Dislike]
Duplicates removed: 2
Final unique responses: 2
Status: Data cleaning completed successfullyאם כותרת הסקר היא "Event Rating" והתשובות הן "Amazing", "Okay", "Great", התוכנית שלכם צריכה להציג:
Survey: Event Rating
Original responses: [Amazing, Okay, Great]
Total responses collected: 3
Converting to Set to remove duplicates...
Unique responses (Set): {Amazing, Okay, Great}
Converting back to List...
Cleaned responses: [Amazing, Okay, Great]
Duplicates removed: 0
Final unique responses: 3
Status: Data cleaning completed successfullyהתוכנית שלכם חייבת להדגים את התבנית המלאה List → Set → List. תחילה אחסנו את כל התשובות ב-List, לאחר מכן השתמשו ב-Set.from() כדי ליצור Set מתוך ה-List, ולבסוף השתמשו ב-toList() כדי להמיר את ה-Set בחזרה ל-List. חשבו את מספר הכפילויות שהוסרו על ידי חיסור מספר הערכים הייחודיים הסופי ממספר הערכים המקורי הכולל.
נסו בעצמכם
import 'dart:io';
void main() {
// קראו את כותרת הסקר
String? surveyTitle = stdin.readLineSync();
// קראו את התשובות לסקר עד "responses_done"
List<String> originalResponses = [];
String? response;
while ((response = stdin.readLineSync()) != "responses_done") {
if (response != null) {
originalResponses.add(response);
}
}
// TODO: כתבו את הקוד שלכם למטה
// 1. השתמשו ב-Set.from() כדי להמיר את הרשימה ל-Set (מסיר כפילויות)
// 2. השתמשו ב-toList() כדי להמיר את ה-Set בחזרה ל-List
// 3. חשבו את מספר הכפילויות שהוסרו ואת הכמויות הסופיות
// הדפיסו את התוצאות בפורמט הנדרש
print("Survey: $surveyTitle");
print("Original responses: $originalResponses");
// הוסיפו כאן את שאר פקודות ההדפסה
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
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 אונליין