التكرار عبر عناصر المجموعة
جزء من قسم Logic & Flow في رحلة GO على Coddy — الدرس 36 من 68.
الآن بعد أن أصبح بإمكانك إضافة العناصر والتحقق منها وإزالتها من مجموعتك (set)، حان الوقت لتعلم كيفية المرور عبر جميع العناصر. وبما أن مجموعة Go الخاصة بك مبنية على خريطة (map)، يمكنك استخدام حلقة for...range المألوفة للوصول إلى كل عنصر.
لتكرار العناصر عبر مجموعة (set)، يمكنك استخدام نفس الصيغة المستخدمة لتكرار العناصر عبر خريطة (map)، ولكنك تهتم فقط بالمفاتيح:
for color := range colors {
fmt.Println(color)
}لاحظ أننا نستخدم متغيراً واحداً فقط في حلقة range. وبما أننا لا نحتاج إلى القيم (والتي هي جميعاً empty structs)، يمكننا تجاهلها تماماً. سيؤدي هذا إلى طباعة كل لون في مجموعتك، لون واحد في كل سطر.
يمكنك أيضًا استخدام صيغة المتغيرين إذا كنت تفضل أن تكون صريحًا بشأن تجاهل القيمة:
for color, _ := range colors {
fmt.Println(color)
}تذكر أن الخرائط (maps) في لغة Go لا تضمن أي ترتيب معين عند التكرار (iterating)، لذا قد يتم طباعة عناصر المجموعة (set) بترتيب مختلف في كل مرة تقوم فيها بتشغيل البرنامج. هذا سلوك طبيعي تماماً للمجموعات، حيث أنها مصممة لاختبار العضوية (membership testing) بدلاً من الحفاظ على الترتيب.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
التحدي
سهلقم ببناء محلل لقائمة تشغيل الموسيقى يعالج مجموعات الأغاني ويعرض معلومات مفصلة حول كل قائمة تشغيل باستخدام أسلوب الـ set (المجموعة) في لغة Go. يوضح هذا التحدي كيفية التكرار (iterate) عبر المجموعات لفحص محتوياتها وإعداد تقارير عنها.
ستتلقى مدخلين:
- سلسلة نصية تحتوي على أغاني روك مفصولة بفاصلة (على سبيل المثال،
"Bohemian Rhapsody,Stairway to Heaven,Hotel California,Sweet Child O Mine") - سلسلة نصية تحتوي على أغاني بوب مفصولة بفاصلة (على سبيل المثال،
"Shape of You,Blinding Lights,Watermelon Sugar,Levitating")
مهمتك هي:
- إنشاء مجموعتين باستخدام أسلوب Go المعتاد
map[string]struct{}لتخزين أغاني الروك وأغاني البوب بشكل منفصل - تحليل كلتا السلسلتين النصيتين للمدخلات عن طريق تقسيمهما عند الفواصل للحصول على عناوين الأغاني الفردية
- إضافة كل أغنية إلى المجموعة المناسبة باستخدام قيمة الـ 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 فحص جميع العناصر في المجموعة، مما يجعلها مثالية لمهام التحليل وإعداد التقارير.
ورقة مرجعية
للتكرار عبر مجموعة (set) في Go، استخدم حلقة for...range مع متغير واحد للوصول إلى المفاتيح فقط:
for color := range colors {
fmt.Println(color)
}يمكنك أيضاً استخدام صيغة المتغيرين وتجاهل القيمة صراحةً:
for color, _ := range colors {
fmt.Println(color)
}لاحظ أن الخرائط (maps) في 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 keys) إلى شريحة (slice)، ثم قم بفرزها، ثم كرر العملية للحصول على ترتيب متسق
_ = rockSet
_ = popSet
_ = rockList
_ = popList
_ = fmt.Sprintf
_ = sort.Strings
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1تدفق التحكم المتقدم
جملة Switch مع `fallthrough`الخروج من الحلقات المتداخلةالاستمرار في حلقة محددةجملة `goto`ملخص - التحكم المتقدم في الحلقات2الـ Structs والميثودز (Methods)
تعريف الـ Methods على الـ Structsالـ Value Receiversالـ Pointer Receiversاختيار الـ Receiversالـ Methods مقابل الـ Functionsملخص - سلوك الـ Struct5تعمق في الـ Maps
Maps من نوع Structsالـ Pointers كقيم في الـ Mapsالتحقق من الـ Nil Mapsمقارنة الـ Mapsمراجعة - عداد تكرار الكلمات3الواجهات (الأساسيات)
ما هي الواجهة؟تعريف الواجهةتطبيق الواجهةاستخدام أنواع الواجهاتالواجهة الفارغةتأكيدات النوع (Type Assertions)تبديل النوع (Type Switch)ملخص - الأشكال والسلوكيات6أسلوب Go الاصطلاحي: المجموعات
أسلوب المجموعات في Goإنشاء مجموعةالإضافة إلى مجموعةالتحقق من العضوية في المجموعةالحذف من مجموعةالتكرار عبر عناصر المجموعةمراجعة - أسماء مستخدمين فريدة