חיתוך קבוצות
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-Dart של Coddy. שיעור 23 מתוך 65.
כשצריך למצוא איברים שקיימים בשתי אוספי Set, המתודה intersection() מספקת את הפתרון המושלם. הפעולה הזאת מזהה את האיברים המשותפים בין שתי קבוצות, ויוצרת קבוצה חדשה שמכילה רק את הפריטים שמופיעים בשני האוספים המקוריים.
השיטה intersection() פועלת על ידי השוואת האיברים של שתי קבוצות והחזרת קבוצה חדשה המכילה רק את הערכים המשותפים. כמו פעולות אחרות על קבוצות, היא מטפלת באופן אוטומטי בייחודיות, כך שכל איבר משותף מופיע פעם אחת בלבד בתוצאה.
Set<String> aliceFriends = {'Bob', 'Charlie', 'Diana', 'Eve'};
Set<String> bobFriends = {'Alice', 'Charlie', 'Frank', 'Diana'};
Set<String> mutualFriends = aliceFriends.intersection(bobFriends);
print(mutualFriends); // {Charlie, Diana}פעולה זו שימושית במיוחד למציאת חפיפות בנתונים, כגון תחומי עניין משותפים בין משתמשים, מיומנויות משותפות בצוותים או קריטריונים תואמים בפעולות סינון. החיתוך עוזר לזהות מה משותף לשתי אוספים, ולכן הוא שימושי למשימות השוואה וניתוח.
אתגר
קלצרו תוכנית שמנהלת פלטפורמת מדיה חברתית באמצעות מציאת קשרים משותפים בין שני משתמשים. התוכנית שלכם צריכה:
- לקרוא קלט של מחרוזת שמייצג את שם המשתמש הראשון
- לקרוא כמה קלטים של מחרוזות שמייצגים את הקשרים של המשתמש הראשון (הקלט יסתיים כשתקבלו
"user1_done") - לקרוא קלט של מחרוזת שמייצג את שם המשתמש השני
- לקרוא כמה קלטים של מחרוזות שמייצגים את הקשרים של המשתמש השני (הקלט יסתיים כשתקבלו
"user2_done") - ליצור שתי קבוצות נפרדות לאחסון הקשרים של כל משתמש
- להשתמש במתודה
intersection()כדי למצוא קשרים משותפים בין שני המשתמשים - להדפיס את תוצאות ניתוח הקשרים בדיוק בפורמט שמוצג בהמשך
לדוגמה, אם המשתמשת הראשונה היא "Alice" והקשרים שלה הם "Bob", "Charlie", "Diana", "Eve", והמשתמש השני הוא "Bob" והקשרים שלו הם "Alice", "Charlie", "Frank", "Diana", התוכנית שלכם צריכה להפיק את הפלט הבא:
User Analysis: Finding mutual connections
Alice's connections: {Bob, Charlie, Diana, Eve}
Bob's connections: {Alice, Charlie, Frank, Diana}
Mutual connections: {Charlie, Diana}
Total mutual connections: 2
Connection strength: Strong (2+ mutual connections)
Status: Users have mutual connectionsאם המשתמשת הראשונה היא "Sarah" והקשרים שלה הם "John", "Mike", "Lisa", והמשתמש השני הוא "Tom" והקשרים שלו הם "Emma", "David", "Kate", התוכנית שלכם צריכה להפיק את הפלט הבא:
User Analysis: Finding mutual connections
Sarah's connections: {John, Mike, Lisa}
Tom's connections: {Emma, David, Kate}
Mutual connections: {}
Total mutual connections: 0
Connection strength: None (no mutual connections)
Status: Users have no mutual connectionsאם המשתמשת הראשונה היא "Emma" והקשרים שלה הם "Alex", "Jordan", "Taylor", "Morgan", והמשתמש השני הוא "Jordan" והקשרים שלו הם "Emma", "Taylor", "Casey", התוכנית שלכם צריכה להפיק את הפלט הבא:
User Analysis: Finding mutual connections
Emma's connections: {Alex, Jordan, Taylor, Morgan}
Jordan's connections: {Emma, Taylor, Casey}
Mutual connections: {Taylor}
Total mutual connections: 1
Connection strength: Weak (1 mutual connection)
Status: Users have mutual connectionsהתוכנית שלכם חייבת להשתמש במתודה intersection() כדי למצוא קשרים משותפים בין הקבוצות של שני המשתמשים. קבעו את חוזק הקשר לפי מספר הקשרים המשותפים: "None" עבור 0 קשרים משותפים, "Weak" עבור קשר משותף אחד בדיוק, ו-"Strong" עבור 2 קשרים משותפים או יותר. אם יש קשרים משותפים, הציגו את "Users have mutual connections" כסטטוס; אחרת, הציגו את "Users have no mutual connections".
נסו בעצמכם
import 'dart:io';
void main() {
// קראו את שם המשתמש הראשון
String? user1Name = stdin.readLineSync();
// קראו את פרטי המשתמש הראשון 's connections עד "user1_done"
Set<String> user1Connections = <String>{};
String? connection;
while ((connection = stdin.readLineSync()) != "user1_done") {
if (connection != null) {
user1Connections.add(connection);
}
}
// קראו את שם המשתמש השני
String? user2Name = stdin.readLineSync();
// קראו את פרטי המשתמש השני 's connections עד "user2_done"
Set<String> user2Connections = <String>{};
while ((connection = stdin.readLineSync()) != "user2_done") {
if (connection != null) {
user2Connections.add(connection);
}
}
// TODO: כתבו את הקוד שלכם למטה
// מצאו קשרים משותפים באמצעות המתודה intersection()
// קבעו את חוזק הקשר לפי מספר הקשרים המשותפים
// צרו את פורמט הפלט הנדרש
// הדפיסו את תוצאות הניתוח
print("User Analysis: Finding mutual connections");
// הוסיפו כאן את פקודות הפלט שלכם
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
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 אונליין