الحذف من مجموعة
جزء من قسم Logic & Flow في رحلة GO على Coddy — الدرس 35 من 68.
في بعض الأحيان قد تحتاج إلى إزالة عناصر من مجموعتك، وتجعل لغة Go هذا الأمر سهلاً ومباشراً باستخدام دالة delete() المدمجة. وبما أن مجموعتك هي في الأساس عبارة عن خريطة (map)، فإن إزالة عنصر تعمل تماماً مثل إزالة مفتاح من خريطة.
لإزالة عنصر من مجموعتك، استخدم الدالة delete() مع مجموعتك والعنصر الذي تريد إزالته:
delete(colors, "red")تأخذ الدالة delete() معاملين: الخريطة (مجموعتك) والمفتاح الذي تريد إزالته. إذا كان العنصر موجوداً في المجموعة، فسيتم حذفه. إذا لم يكن العنصر موجوداً، فلن تفعل الدالة شيئاً - ولن يتم طرح أي خطأ.
هذا السلوك مثالي للمجموعات (sets) لأنك غالباً ما تريد التأكد من عدم وجود عنصر ما، بغض النظر عما إذا كان موجوداً في البداية أم لا. تتميز هذه العملية بالسرعة والكفاءة، مع الحفاظ على مزايا الأداء لتطبيق الخريطة (map) الأساسي في لغة Go.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
التحدي
سهلقم ببناء نظام لإدارة كتب المكتبة يقوم بإزالة الكتب من مجموعات الأنواع المختلفة باستخدام أسلوب الـ set في لغة Go. يوضح هذا التحدي كيفية استخدام وظيفة delete() لإزالة العناصر من المجموعات (sets) مع تتبع عملية الإزالة.
ستتلقى مدخلين:
- سلسلة نصية تحتوي على الكتب في مجموعة الخيال العلمي مفصولة بفاصلة (على سبيل المثال،
"1984,Dune,Foundation,Neuromancer,Brave New World") - سلسلة نصية تحتوي على الكتب المراد إزالتها مفصولة بفاصلة (على سبيل المثال،
"Dune,Harry Potter,Foundation,Twilight,1984")
مهمتك هي:
- إنشاء مجموعة (set) باستخدام أسلوب Go المعتاد
map[string]struct{}لتخزين كتب الخيال - تحليل سلسلة الإدخال الأولى عن طريق تقسيمها عند الفواصل للحصول على عناوين الكتب الفردية
- إضافة كل كتاب إلى مجموعتك باستخدام قيمة الـ struct الفارغة
{} - تحليل سلسلة الإدخال الثانية عن طريق تقسيمها عند الفواصل للحصول على قائمة الكتب المراد إزالتها
- لكل كتاب مطلوب إزالته، تحقق مما إذا كان موجوداً في المجموعة باستخدام أسلوب comma ok
- عرض عملية الإزالة لكل كتاب تتم معالجته:
- إذا كان الكتاب موجوداً في المجموعة:
"Removing: [book_title]" - إذا لم يكن الكتاب موجوداً في المجموعة:
"Not found: [book_title]"
- إذا كان الكتاب موجوداً في المجموعة:
- استخدم وظيفة
delete()لإزالة الكتب الموجودة في المجموعة - بعد معالجة جميع طلبات الإزالة، اعرض ملخصاً:
"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]"
- أخيراً، قم بإدراج جميع الكتب المتبقية في المجموعة:
- العنوان:
"Remaining books in fiction collection:" - كل كتاب في سطر منفصل:
"- [book_title]" - إذا لم يتبق أي كتب:
"- Collection is empty"
- العنوان:
استخدم حزمة strings لتقسيم سلاسل الإدخال عند الفواصل. يوضح هذا التحدي كيف تقوم وظيفة delete() بإزالة العناصر بأمان من مجموعة Go، دون حدوث أخطاء حتى عند محاولة إزالة عناصر غير موجودة، مما يجعلها مثالية لعمليات التنظيف.
ورقة مرجعية
لإزالة عناصر من مجموعة (set) في لغة Go، استخدم دالة delete() المدمجة:
delete(colors, "red")تأخذ دالة delete() معاملين: الخريطة (المجموعة الخاصة بك) والمفتاح الذي تريد إزالته. إذا كان العنصر موجوداً، فسيتم حذفه. وإذا لم يكن موجوداً، فلا تفعل الدالة شيئاً - ولا يتم إلقاء أي خطأ.
هذا يجعل delete() مثالية للمجموعات لأنك غالباً ما تريد التأكد من عدم وجود عنصر ما، بغض النظر عما إذا كان موجوداً في الأصل أم لا.
جرّب بنفسك
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. إنشاء مجموعة (set) باستخدام map[string]struct{} لتخزين الكتب الخيالية
// 2. إضافة كل كتاب من fictionList إلى المجموعة
// 3. معالجة كل كتاب في removeList والتحقق مما إذا كان موجوداً
// 4. عرض عملية الإزالة واستخدام دالة delete()
// 5. عرض إحصائيات الملخص
// 6. قائمة الكتب المتبقية في المجموعة
// تذكر ترتيب الكتب المتبقية للحصول على مخرجات متسقة
_ = sort.Strings // قم بإزالة هذا السطر بمجرد استخدام sort
_ = fmt.Println // قم بإزالة هذا السطر بمجرد استخدام fmt
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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إنشاء مجموعةالإضافة إلى مجموعةالتحقق من العضوية في المجموعةالحذف من مجموعةالتكرار عبر عناصر المجموعةمراجعة - أسماء مستخدمين فريدة