أستمع الى المقال

استعرضنا في الدرس السابق، القوائم Lists بنوعيها: الغير قابل للتغيير Immutable، و القابل للتغيير Mutable. وشرحنا كيفية استخدامها في تجميع عدد من الكائنات من نفس النوع. بحيث يكون الترتيب مهم ويمكن تكرار العناصر في القائمة. في هذا الدرس، سنتعلم النوع الثاني من التجميعات Collections النوع Set.

ما هي ال Set:

هي تجميع لعدة عناصر من نفس نوع البيانات في مكان واحد، تمامًا مثل الـ Lists. ولكن خلافاً للـ List، يُعَدُّ ترتيب العناصر في Set غير مهم، وستكون العناصر فريدة ولا يمكن تكرارها. وهو ما سنشرحه عمليًا في آخر هذا الدرس.

إنشاء الـ Set:

تعتبر Set نوع بيانات عام. أي يمكنها قبول أي نوع بيانات آخر، سواء كان من الأنواع الأساسية في كوتلن، أو صنف خاص بنا. ويمكننا تهيئتها بمساعدة الدالة <setOf<E، حيث E هو نوع بيانات العناصر التي ستحتويها تجميعة Set، أيًا كان نوعها.

كمثال، يمكننا وضع نفس العناصر التي وضعناها في قائمة List في الدرس السابق، في تجميعة من النوع Set:

val fruits = setOf<String>(“Orange”, “Apple”, “Banana”, “Mango”, “Avocado”)

أو مثلما فعلنا مع القائمة List، يمكننا التخلي عن ذكر نوع بيانات العناصر صراحةً:

val fruits = setOf(“Orange”, “Apple”, “Banana”, “Mango”, “Avocado”)

الخصائص والدوال:

يمكن استخدام خاصية size لمعرفة حجم (عدد العناصر) في تجميعة Set. بالإضافة لبعض الدوال مثل: ()isEmpty، للتأكد من أن التجميعة ليست فارغة. ودالة ()contains أو الكلمة المفتاحية in، لمعرفة أن عنصرًا ما أو عدة عناصر متواجدة في الـ Set. الآن يمكننا وضع كل ذلك في شفرة لفهمه أكثر:

وعند تنفيذ الشفرة سيكون الناتج:

أطقم Set قابلة للتغيير Mutable Sets:

عند إنشاء تجميعة باستخدام دالة ()setOf، نحصل تلقائيًا على تجميعة Set ثابتة غير قابلة للتغيير Immutable Set. أما إذا أردنا تجميعة مرنة نستطيع الإضافة إليها والحذف منها وتغيير عناصرها، سنقوم بإنشائها عبر استخدام دالة ()mutableSetOf:

val fruits = mutableSetOf(“Orange”)

دوال إضافية للأطقم القابلة للتغيير:

هناك بعض الدوال التي يمكن استخدامها مع تجميعات Set قابلة للتغيير فقط. مثل: دالة ()add لإضافة عنصر واحد، ودالة ()addAll لإضافة عدة عناصر. ودالة ()remove لحذف عنصر واحد، ودالة ()removeAll لحذف عدة عناصر:

وعند تنفيذ الشفرة، ستكون نتيجة الطباعة:

يمكن إيجاد كل الخصائص والدوال التي يمكننا استخدامها مع Set، في هذا الرابط من موقع كوتلن الرسمي.

الفرق بين القوائم Lists والأطقم Sets:

في معظم الحالات التي نحتاج فيها تجميع عناصر معًا، قد يكفي استخدام List. ولكن في بعض الحالات قد نحتاج أن نضمن عدم تكرار العناصر في التجميعة. وهذا ما ستساعدنا فيه التجميعة Set، كما قلنا في بداية هذا الدرس.

للتوضيح أكثر، يمكننا كتابة برنامج يطلب من المستخدم إدخال اللغات التي يعرفها. وسنستخدم القائمة List:

البرنامج يطلب من المستخدم إدخال قائمة اللغات التي يعرفها. ويقرأ مدخلات المستخدم عبر دالة ()readln، ثم يضيفها إلى قائمة MutableList، وأخيرا يطبع النتائج بطريقة القوالب النصية في كوتلن. نلاحظ أننا في حلقة for، بدأنا الفهرس index من الرقم 1، ﻷننا نريد طباعة اللغات الأخرى بدون اللغة ذات الفهرس رقم 0 وهي Arabic. ولفهم كلمة until، يرجى مراجعة درس حلقة التكرار for والنطاقات.

الدوال الجديدة في الشفرة، دالة ()first والتي ستُعيد العنصر الأول في التجميعة. يقابلها دالة ()last والتي تُعيد العنصر الأخير في التجميعة. ودالة ()elementAt والتي سنسرسل إليها رقم فهرس العنصر لتعيد قيمة العنصر. وهي تشبه دالة ()get التي استخدمناها مع القوائم Lists. مع العلم أن دالة ()get أو أقواس الفهرس المربعة [ ]، لن يعملا مع تجميعة الـ Set.

وبعد تنفيذ الشفرة، كانت النتيجة:

أدخل المستخدم لغته الأم “Arabic” في البداية، ثم ادخلها مرةً اخرى مع اللغات الأخرى. وأخطأ وأدخل اللغة الإنجليزية مرتين. ليطبع له البرنامج أنه يتحدث 6 لغات بجانب اللغة الأم، بدلًا عن 4 لغات. وهذا الخطأ نتج عن التكرار غير المقصود من المستخدم.

تحسين البرنامج:

لتلافي هذا الخطأ، يمكننا حراسة المدخلات التي يدخلها المستخدم عبر كتلة if الشرطية، ووضع شروط لمنع التكرار. أو يمكننا بكل بساطة تغيير سطر واحد، بالتخلي عن استخدام List، واستبدالها بـ Set:

val languages = mutableSetOf<String>()

وعند تنفيذ الشفرة بعد التغيير:

كما نرى في الصورة، تجاهلتْ الـ Set مدخلات المستخدم المكررة، واحتفظتْ بعناصر فريدة في التجميعة، وهو خلاف ما فعلته القائمة List.

هذا الدرس هو جزء من سلسلة تعليم مبادئ البرمجة بلغة كوتلن. لمُتابعة الدروس منذ البداية ومُشاهدة فهرس المحتويات يمكنك الانتقال إلى الدرس الأول من هنا.

هل أعجبك المحتوى وتريد المزيد منه يصل إلى صندوق بريدك الإلكتروني بشكلٍ دوري؟
انضم إلى قائمة من يقدّرون محتوى إكسڤار واشترك بنشرتنا البريدية.