Menu
Coddy logo textTech

הסרה מקבוצה

חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-GO של Coddy. שיעור 35 מתוך 68.

לפעמים צריך להסיר איברים מהקבוצה שלך, ו-Go מאפשרת לעשות זאת בקלות באמצעות הפונקציה המובנית delete(). מכיוון שהקבוצה שלך היא למעשה מפה מתחת לפני השטח, הסרת איבר פועלת בדיוק כמו הסרת מפתח ממפה.

כדי להסיר איבר מהקבוצה שלך, השתמש בפונקציה delete() עם הקבוצה שלך והאיבר שברצונך להסיר:

delete(colors, "red")

הפונקציה delete() מקבלת שני פרמטרים: המפה (הקבוצה שלך) והמפתח שברצונך להסיר. אם הרכיב קיים בקבוצה, הוא יוסר. אם הרכיב לא קיים, הפונקציה לא עושה דבר - לא נזרקת שגיאה.

ההתנהגות הזאת מושלמת עבור קבוצות, כי לעיתים קרובות רוצים לוודא שאלמנט אינו נמצא בהן, בלי קשר לשאלה אם הוא היה שם מלכתחילה. הפעולה מהירה ויעילה, ושומרת על יתרונות הביצועים של מימוש המפה הבסיסי של Go.

challenge icon

אתגר

קל

בנו מערכת לניהול ספרי ספרייה, שמסירה ספרים מאוספי ז׳אנרים שונים באמצעות האידיומה של קבוצות ב-Go. האתגר הזה מדגים איך להשתמש בפונקציה delete() כדי להסיר איברים מקבוצות תוך מעקב אחר תהליך ההסרה.

תקבלו שתי קלטים:

  • מחרוזת המכילה ספרים באוסף הספרות הבדיונית, מופרדים בפסיקים (למשל, "1984,Dune,Foundation,Neuromancer,Brave New World")
  • מחרוזת המכילה ספרים להסרה, מופרדים בפסיקים (למשל, "Dune,Harry Potter,Foundation,Twilight,1984")

עליכם:

  1. ליצור קבוצה באמצעות האידיומה של Go map[string]struct{} כדי לאחסן את ספרי הספרות הבדיונית
  2. לנתח את מחרוזת הקלט הראשונה באמצעות פיצול שלה בפסיקים כדי לקבל את שמות הספרים בנפרד
  3. להוסיף כל ספר לקבוצה באמצעות ערך מסוג struct ריק {}
  4. לנתח את מחרוזת הקלט השנייה באמצעות פיצול שלה בפסיקים כדי לקבל את רשימת הספרים להסרה
  5. לכל ספר להסרה, לבדוק אם הוא נמצא בקבוצה באמצעות אידיומת comma ok
  6. להציג את תהליך ההסרה עבור כל ספר שמעבדים:
    • אם הספר נמצא באוסף: "Removing: [book_title]"
    • אם הספר לא נמצא באוסף: "Not found: [book_title]"
  7. להשתמש בפונקציה delete() כדי להסיר ספרים שנמצאים בקבוצה
  8. לאחר עיבוד כל בקשות ההסרה, להציג סיכום:
    • "Initial collection size: [initial_count]"
    • "Removal requests: [requests_count]"
    • "Books successfully removed: [removed_count]"
    • "Books not found: [not_found_count]"
    • "Final collection size: [final_count]"
  9. לבסוף, לרשום את כל הספרים שנותרו באוסף:
    • כותרת: "Remaining books in fiction collection:"
    • כל ספר בשורה נפרדת: "- [book_title]"
    • אם לא נותרו ספרים: "- Collection is empty"

השתמשו בחבילה strings כדי לפצל את מחרוזות הקלט בפסיקים. האתגר הזה מדגים כיצד הפונקציה delete() מסירה בבטחה איברים מקבוצת Go, בלי להעלות שגיאות גם כשמנסים להסיר איברים שאינם קיימים, ולכן היא מתאימה במיוחד לפעולות ניקוי.

נסו בעצמכם

package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
	"strings"
)

func main() {
	// קראו את הקלט באמצעות Scanner כדי לתמוך בשמות ספרים שמכילים רווחים
	scanner := bufio.NewScanner(os.Stdin)

	scanner.Scan()
	fictionBooks := scanner.Text()
	scanner.Scan()
	booksToRemove := scanner.Text()

	// פענחו את מחרוזות הקלט
	fictionList := strings.Split(fictionBooks, ",")
	removeList := strings.Split(booksToRemove, ",")

	// TODO: כתבו את הקוד שלכם למטה
	// 1. צרו קבוצה באמצעות map[string]struct{} לאחסון ספרי סיפורת
	// 2. הוסיפו לקבוצה כל ספר מתוך fictionList
	// 3. עברו על כל ספר ב-removeList ובדקו אם הוא קיים
	// 4. הציגו את תהליך ההסרה והשתמשו בפונקציה delete()
	// 5. הציגו נתונים סטטיסטיים מסכמים
	// 6. הציגו רשימה של הספרים שנותרו באוסף
	// זכרו למיין את הספרים שנותרו כדי להבטיח פלט עקבי

	_ = sort.Strings // הסירו את השורה הזאת לאחר שתשתמשו ב-sort
	_ = fmt.Println  // הסירו את השורה הזאת לאחר שתשתמשו ב-fmt
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה לוגיקה וזרימת התוכנית

תרגלו בעצמכם: קומפיילר Go אונליין