מעבר על איברי קבוצה
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-GO של Coddy. שיעור 36 מתוך 68.
עכשיו, כשאתה יודע להוסיף, לבדוק ולהסיר איברים מהקבוצה שלך, הגיע הזמן ללמוד איך לעבור על כל האיברים. מכיוון שקבוצת ה-Go שלך מבוססת על מפה, תוכל להשתמש בלולאת for...range המוכרת כדי לגשת לכל איבר.
כדי לעבור על קבוצה, משתמשים באותו תחביר כמו למעבר על מפה, אבל מתעניינים רק במפתחות:
for color := range colors {
fmt.Println(color)
}שימו לב שאנחנו משתמשים רק במשתנה אחד בלולאת הטווח. מכיוון שאין לנו צורך בערכים (שכולם מבנים ריקים), אפשר להתעלם מהם לחלוטין. פעולה זו תדפיס כל צבע בקבוצה שלכם, אחד בכל שורה.
אפשר גם להשתמש בצורה עם שני משתנים, אם מעדיפים לציין במפורש שמתעלמים מהערך:
for color, _ := range colors {
fmt.Println(color)
}חשוב לזכור שמפות ב-Go אינן מבטיחות סדר מסוים בעת איטרציה, ולכן ייתכן שרכיבי הקבוצה יודפסו בסדר שונה בכל פעם שמריצים את התוכנית. זוהי התנהגות רגילה לחלוטין עבור קבוצות, שכן הן מיועדות לבדיקת שייכות ולא לשמירה על סדר.
אתגר
קלבנו מנתח של רשימות השמעה מוזיקליות, שמעבד אוספי שירים ומציג מידע מפורט על כל רשימת השמעה באמצעות אידיום הקבוצות של Go. האתגר הזה מדגים כיצד לעבור על קבוצות כדי לבדוק את התוכן שלהן ולדווח עליו.
תקבלו שתי כניסות:
- מחרוזת המכילה שירי רוק המופרדים בפסיקים (למשל,
"Bohemian Rhapsody,Stairway to Heaven,Hotel California,Sweet Child O Mine") - מחרוזת המכילה שירי פופ המופרדים בפסיקים (למשל,
"Shape of You,Blinding Lights,Watermelon Sugar,Levitating")
עליכם:
- ליצור שתי קבוצות באמצעות האידיום של Go
map[string]struct{}כדי לאחסן את שירי הרוק ואת שירי הפופ בנפרד - לנתח את שתי מחרוזות הקלט על ידי פיצול שלהן לפי פסיקים, כדי לקבל כותרות של שירים בודדים
- להוסיף כל שיר לקבוצה המתאימה באמצעות הערך של מבנה ריק
{} - להציג את הניתוח של רשימת ההשמעה של הרוק:
- כותרת:
"Rock Playlist Analysis:" - מספר:
"Total rock songs: [count]" - כותרת השירים:
"Songs in rock playlist:" - כל שיר בשורה נפרדת:
"♪ [song_title]"
- כותרת:
- להציג את הניתוח של רשימת ההשמעה של הפופ:
- כותרת:
"Pop Playlist Analysis:" - מספר:
"Total pop songs: [count]" - כותרת השירים:
"Songs in pop playlist:" - כל שיר בשורה נפרדת:
"♪ [song_title]"
- כותרת:
- ליצור רשימת השמעה משולבת על ידי מיזוג שתי הקבוצות לקבוצה חדשה
- להציג את הניתוח של רשימת ההשמעה המשולבת:
- כותרת:
"Combined Playlist Analysis:" - מספר:
"Total unique songs: [count]" - כותרת השירים:
"All songs in combined playlist:" - כל שיר בשורה נפרדת:
"♫ [song_title]"
- כותרת:
- לבסוף, להציג סיכום:
"Playlist Summary:""Rock songs: [rock_count]""Pop songs: [pop_count]""Combined unique songs: [combined_count]"
השתמשו בחבילה strings כדי לפצל את מחרוזות הקלט לפי פסיקים. כדי לעבור על כל קבוצה, השתמשו בלולאת for...range עם משתנה יחיד, כדי לגשת למפתחות בלבד (כותרות השירים). האתגר הזה מדגים כיצד מעבר על קבוצות של Go מאפשר לבדוק את כל האיברים באוסף, ולכן הוא מתאים במיוחד למשימות של ניתוח ודיווח.
נסו בעצמכם
package main
import (
"bufio"
"fmt"
"os"
"sort"
"strings"
)
func main() {
// קראו שורות שלמות באמצעות bufio.Scanner (תומך בשמות שירים הכוללים רווחים)
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
rockSongs := scanner.Text()
scanner.Scan()
popSongs := scanner.Text()
// צרו קבוצות באמצעות התבנית המקובלת ב-Go map[string]struct{}
rockSet := make(map[string]struct{})
popSet := make(map[string]struct{})
// נתחו את מחרוזות הקלט ומלאו את הקבוצות
rockList := strings.Split(rockSongs, ",")
popList := strings.Split(popSongs, ",")
// TODO: כתבו את הקוד שלכם למטה
// הוסיפו את השירים לקבוצות המתאימות להם
// הציגו ניתוח של רשימת השמעה של רוק (מיינו את השירים כדי להבטיח פלט עקבי)
// הציגו ניתוח של רשימת השמעה של פופ (מיינו את השירים כדי להבטיח פלט עקבי)
// צרו והציגו ניתוח של רשימת השמעה משולבת (מיינו את השירים כדי להבטיח פלט עקבי)
// הציגו סיכום של רשימות ההשמעה
// זכרו: המירו את המפתחות של map ל-slice, מיינו, ואז עברו עליהם לפי הסדר כדי להבטיח סדר עקבי
_ = rockSet
_ = popSet
_ = rockList
_ = popList
_ = fmt.Sprintf
_ = sort.Strings
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
1בקרת זרימה מתקדמת
switch עם `fallthrough`יציאה מלולאות מקוננותהמשך לולאה מסוימתהצהרת `goto`סיכום – שליטה מתקדמת בלולאות4פרויקט: רשימת משימות פשוטה
הגדרת הפרויקטהוספת משימה2מבנים ושיטות
הגדרת שיטות במבניםמקבלי ערךמקבלי מצביעבחירת מקבליםשיטות לעומת פונקציותסיכום — התנהגות המבנים5מפות לעומק
מפות של Structsמצביעים כערכים במפהבדיקה אם מפות הן nilהשוואת מפותסיכום - מונה תדירות מילים8פרויקט: ניהול מלאי פשוט
סקירת הפרויקטבדיקת המלאי3ממשקים (הבסיס)
מהו ממשק?הגדרת ממשקמימוש ממשקשימוש בטיפוסי ממשקממשק ריקבדיקות טיפוסמתג טיפוסיםסיכום – צורות והתנהגויות6קבוצות בסגנון המקובל ב-Go
דפוס הקבוצה ב-Goיצירת קבוצההוספה לקבוצהבדיקת חברות בקבוצההסרה מקבוצהמעבר על איברי קבוצהסיכום – שמות משתמש ייחודייםתרגלו בעצמכם: קומפיילר Go אונליין