Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

إنشاء مجموعة

جزء من قسم Logic & Flow في رحلة GO على Coddy — الدرس 32 من 68.

بعد أن فهمت المفهوم الكامن وراء أسلوب المجموعات (set idiom) في لغة Go، حان الوقت لتطبيقه عمليًا من خلال إنشاء مجموعتك الأولى. العملية مباشرة وتتبع نفس الأنماط التي تعلمتها بالفعل مع الخرائط (maps).

لإنشاء مجموعة (set) في لغة Go، تقوم بالتصريح عن متغير باستخدام نمط map[T]struct{}، حيث T هو نوع العناصر التي تريد تخزينها. إليك كيفية إنشاء مجموعة لتخزين أسماء ألوان فريدة:

colors := make(map[string]struct{})

يمكنك أيضاً تهيئة مجموعة (set) ببعض القيم الأولية باستخدام صيغة الـ map literal:

colors := map[string]struct{}{
    "red":   {},
    "blue":  {},
    "green": {},
}

لاحظ كيف أن كل قيمة هي عبارة عن struct literal فارغ {}. يؤدي هذا إلى إنشاء القيمة الصفرية (zero value) لـ struct{}، والتي لا تشغل أي مساحة في الذاكرة بينما لا تزال تسمح للمفتاح بالتواجد في الخريطة (map).

يكمن جمال هذا الأسلوب في أنه يستفيد من بنية map الأساسية في لغة Go مع توفير دلالات set الحقيقية - حيث يمكن لكل اسم لون أن يظهر مرة واحدة فقط، وتحصل على أوقات بحث سريعة تماماً كما هو الحال مع خرائط map العادية.

quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

challenge icon

التحدي

سهل

قم بإنشاء متتبع لتفضيلات لغات البرمجة يوضح أسلوب (idiom) المجموعات (set) في لغة Go لتخزين العناصر الفريدة. يوضح هذا التحدي كيفية استخدام نمط map[string]struct{} لتتبع لغات البرمجة دون تكرار.

ستتلقى مدخلين:

  • سلسلة نصية تمثل عدد اللغات التي سيتم معالجتها (مثلاً، "6")
  • سلسلة نصية تحتوي على لغات البرمجة مفصولة بفاصلة (مثلاً، "Go,Python,JavaScript,Go,Java,Python,C++,JavaScript")

مهمتك هي:

  1. إنشاء مجموعة (set) باستخدام أسلوب Go وهو map[string]struct{} لتخزين لغات البرمجة الفريدة
  2. تحليل سلسلة المدخلات عن طريق تقسيمها عند الفواصل للحصول على أسماء اللغات الفردية
  3. إضافة كل لغة إلى مجموعتك باستخدام بنية فارغة {} كقيمة
  4. عرض نتائج المعالجة عن طريق طباعة كل لغة عند مواجهتها:
    • إذا كانت اللغة جديدة في المجموعة: "Added: [language]"
    • إذا كانت اللغة موجودة بالفعل في المجموعة: "Already exists: [language]"
  5. بعد معالجة جميع اللغات، قم بعرض ملخص:
    • "Total languages processed: [total_count]"
    • "Unique languages: [unique_count]"
  6. أخيرًا، قم بسرد جميع اللغات الفريدة في المجموعة:
    • العنوان: "Programming languages in set:"
    • كل لغة في سطر منفصل: "- [language]"

استخدم حزمة strings لتقسيم سلسلة المدخلات وحزمة strconv لتحويل سلسلة العدد إلى عدد صحيح. للتحقق مما إذا كانت اللغة موجودة بالفعل في المجموعة قبل إضافتها، استخدم أسلوب comma ok: _, exists := languageSet[language]. يوضح هذا التحدي كيف يوفر أسلوب المجموعة في Go طريقة فعالة لتتبع العناصر الفريدة ومنع التكرار في بياناتك.

ورقة مرجعية

لإنشاء مجموعة (set) في لغة Go، استخدم نمط map[T]struct{} حيث T هو نوع العنصر:

colors := make(map[string]struct{})

يمكنك أيضاً تهيئة مجموعة بقيم أولية باستخدام صيغة الـ map literal:

colors := map[string]struct{}{
    "red":   {},
    "blue":  {},
    "green": {},
}

كل قيمة هي عبارة عن struct literal فارغ {} والذي ينشئ القيمة الصفرية (zero value) لـ struct{} ولا يشغل أي مساحة في الذاكرة مع السماح للمفتاح بالتواجد في الـ map.

للتحقق مما إذا كان العنصر موجوداً في المجموعة، استخدم أسلوب comma ok:

_, exists := languageSet[language]

جرّب بنفسك

package main

import (
	"fmt"
	"sort"
	"strconv"
	"strings"
)

func main() {
	// قراءة المدخلات
	var countStr string
	var languagesStr string
	fmt.Scanln(&countStr)
	fmt.Scanln(&languagesStr)
	
	// تحويل نص العدد إلى عدد صحيح (غير مطلوب لهذا التحدي)
	_, _ = strconv.Atoi(countStr)
	
	// تقسيم نص اللغات بواسطة الفواصل
	languages := strings.Split(languagesStr, ",")
	
	// إنشاء مجموعة باستخدام أسلوب map[string]struct{}
	languageSet := make(map[string]struct{})
	
	// TODO: اكتب الكود الخاص بك أدناه
	// معالجة كل لغة والتحقق مما إذا كانت موجودة في المجموعة
	// استخدم أسلوب comma ok: _, exists := languageSet[language]
	// اطبع "Added: [language]" أو "Already exists: [language]"
	// أضف اللغات إلى المجموعة باستخدام struct literal فارغ {}
	
	// طباعة معلومات الملخص
	// طباعة إجمالي اللغات التي تمت معالجتها وعدد اللغات الفريدة
	
	// طباعة جميع اللغات الفريدة في المجموعة
	fmt.Println("Programming languages in set:")
	// تحويل الخريطة (map) إلى شريحة (slice) وفرزها للحصول على مخرجات متسقة
	// عرض كل لغة بتنسيق "- [language]"
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Logic & Flow