مفاهيم جافا الجزء الثامن – مصفوفات القوائم arraylist

تحدثنا في الدرس السابق عن المصفوفات. في هذا الدرس سوف نسلط الضوء على مشكلة المصفوفات العادية والحلول البديلة في مصفوفات القوائم

المشكلة في المصفوفات:

سرعان ماتبدأ في برمجة شيء جدي او كبير نسبياََ ستلاحظ بأن المصفوفات في الجافا محدودة جداََ .

المشكلة الأولى في المصفوفة هي بأنها محدودة الحجم . إذا قمنا بتعريف مصفوفة بحجم ٥ خانات فإننا لن نستطيع تغيير حجمها, الحل الوحيد هو نسخ محتويات المصفوفة إلى مصفوفة أكبر, او إنشاء مصفوفة أكبر لتناسب توقعاتنا .
المشكلة بإنشاء مصفوفة كبيرة نسبيا هو خسارة معرفة حجم المصفوفة الفعلي.  لأن حجم المصفوفة الكبير لا يعطينا حجم الخانات المستخدمة الفعليه

 

المشكلة الثانية في المصفوفات هي إزاحة العناصر في المصفوفة.   ليس هناك حل لإضافة عنصر في بداية سلسة المصفوفة. لربما نستطيع إنشاء مصفوفة جديدة ذو حجم أكبر ومن ثم نسخ إضافة عنصر في البداية ونسخ القيم القديمة إلى المصفوفة الجديدة. هذا يعني العديد من السطور لتحقيق هدف بسيط!

المشكلة الثالثة في المصفوفات هي إيجاد او حذف قيمة:  سوف نحتاج في كل مرة نريد إيجاد قيمة إلى حلقة for للمرور بجميع الخانات وفحص بإن كانت تحوي القيمة المرادة, ونفس الشيء في حال الحذف من منتصف المصفوفة (وذلك عن طريق قيمة null) , ستبقى الخانة فارغة ولكن مكانها موجود دون إزاحة فعلية .

في الحقيقة يوجد حل لكل هذه المشاكل, وهذا الحل يكمن في مصفوفات القوائم ArrayList !

ماهي ال ArrayList أو مايعرف بمصفوفات القوائم:

في حقيقة الأمر مصفوفات القوائم ArrayList هي عبارة  عن غرض من صف يشير بداخله إلى مصفوفة بشكل غير مرئي (بحيث يقوم بإتلاف ونسخ وإنشاء مصفوفات داخلية حسب الحاجة) . هذا الغرض هو من نمط ArrayList وميزته الأساسية هو إحتوائه على العديد من التوابع التي تقوم بالتحكم ديناميكيا بالمصفوفات لإختصار وقت المبرمجين من إنشاء هذه التوابع بشكل متكرر.

مصفوفة القوائم في النهاية هي صف يقوم بإستخدام واجهة Interface تسمى List.

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

هنالك العديد من الصفوف التي تقوم بإستخدام الواجهة List. ال ArrayList واحدة من هذه الصفوف

 

مثال عملي لإستخدام مصفوفات القوائم ArrayList:

لربما مثال خير من ألف كلمة. دعونا نقوم بتحدي بسيط لكتابة مثال عملي عن إستخدام الArrayList  لنرى مدى فعاليتها.

دعونا بإنشاء لعبة بسيطة صغيرة.  تحتوي هذه اللعبة ٥ أسماء حيوانات و ٥ ألوان, يتم ترتيب الألوان والأسماء بشكل عشوائي لإعطاء نتائج عشوائية. يقوم اللاعب في محاولة تخمين الأسم المركب العشوائي (كمثال “قطة سوداء” ) في حال تم معرفة أحد الأسماء المركبة يفوز اللاعب أو يقوم بالمحاولة مجدداََ!

يقوم البرنامج بطرح أسماء الحيوانات والألوان في البداية قبل تركيبهم العشوائي . وعلى اللاعب بتخمين الإسم واللون الذي ركبه البرنامج. إذا استطاع اللاعب بتخمين الأسم الصحيح يقوم البرنامج بإظهار كلمة Bingo! وعدد وقيم المحاولات التي قام بها اللاعب .

شروط البرنامج:

  • يقوم البرنامج في طباعة أسماء الحيوانات , والألوان المحتملة
    • cat, dog, rabbit, duck , sheep
    • golden, black, white, pink, silver
  • يقوم البرنامج بإنشاء أسماء مركبة عشوائية
  • يقوم المستخدم بإدخال إسم مركب (لون + حيوان)
  • في حال تكرار نفس الإسم المركب يقوم البرنامج بتجاهل المحاولة و إعطاء رسالة (You Already Tried This Option)
  • في حال التخمين الصحيح لأحد الأسماء المركبة يقوم البرنامج بطباعة جميع التخمينات السابقة وعدد المحاولات
  • يقوم البرنامج بحفظ جميع التخمينات حتى لو كانت عشوائية لطباعتها للمستخدم في النهاية

حل البرنامج: 

لبداية الحل دعونا ننشئ الصف الذي يحتوي على أسماء الحيوانات والألوان. فالنقم بتسميته (BingoGame) ومن ثم إنشاء الأسماء المركبة.

كما كنا قد تعلمنا سابقا لإنشاء مصفوفة بحجم ثابت وقيم مبدئية , يمكننا ذلك بسهولة بإستخدام المصفوفة العادية.

 ميزة المصفوفة العادية  لهذا المثال:

  • حجم المصفوفة ثابت
  • يمكن إسناد قيم مبدئية للمصفوفة العادية 

مساوئ المصفوفة العادية لهذا المثال:

  • لايوجد طريقة سهلة لترتيب المصفوفة بشكل عشوائي

ميزة المصفوفة من نمط List لهذا المثال

  • يمكن ترتيبها بشكل عشوائي بإستخدام المكتبة Collections.Suffle

مساوئ المصفوفة من نمط List لهذا المثال:

  • لايمكن إسناد قيم مبدئية في المصفوفة من نمط List

ميزة المصفوفة من نمط ArrayList لهذا المثال:

  • يمكن استخدام توابع جاهزة ك Add , Contains, Remove

لهذا السبب سنقوم بإستخدام نوعين من المصفوفات لإنشاء الصف وتهيئته الل

 

 

لقد قمنا بإنشاء الصف BingoGame وعند تهيئة الصف قمنا بإنشاء مصفوفة من نمط List (وهي نمط الواجهة ). عرفنا المتحول coloredAnimals على أنه من نمط مصفوفة قوائم ArrayList. وأستخدمنا التابع المساعد add لإضافة قيم للمصفوفة الخاصة بهذا المتحول من نمط ArrayList

ملاحظة : يجد دائما تحديد نمط ال ArrayList , في مثالنا هذا نحن نقوم بإستخدام ArrayList لنمط String

دعونا نقوم بإنشاء غرض من هذا الصف لبداية اللعبة

سنتوقف إلى هذا الحد في هذا المثال, يمكنك الآن القيام بتجربة تكميل البرنامج بنفسك, أو إنتظار التتمة في الدرس القادم.

 

لميس

إسمي لميس, اعمل كمهندسة برمجيات في شركة إكسينغ في ألمانيا. بدأت في رحلة العمل في المجال البرمجي منذ أكثر من ١٠ سنوات في سنة ٢٠٠٣ كانت بداية رحلتي المهنية حيث كانت بدايتي مع ألعاب الفلاش.. حالياََ انا استخدم العديد من الأدوات البرمجية في العمل فنحن بحاجة ماسة للإطلاع على احدث التقنيات. هدفي هو نقل ما أتعلمه للمشاركة به وتبادل الخبرات مع الجميع

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *