المصفوفات متعددة الأبعاد
المصفوفات متعددة الأبعاد
حتى الآن كانت كل مصفوفة تعمل معها تحمل قائمة مسطّحة من القيم. كثير من المسائل الواقعية تحتاج إلى هيكلة أعمق: شبكة بيكسل، أو جدول مواعيد، أو رقعة شطرنج — كلها تتطلّب صفوفًا وأعمدة في آنٍ واحد. يتعامل Java مع ذلك عبر المصفوفات متعددة الأبعاد — وهي مصفوفات عناصرها بدورها مصفوفات.
إعلان مصفوفة ثنائية الأبعاد وإنشاؤها
الحالة الأكثر شيوعًا هي المصفوفة ثنائية الأبعاد (2D)، ويمكن تخيّلها كجدول له صفوف وأعمدة. يكفي إضافة زوج إضافي من الأقواس المربّعة في الإعلان:
يخصّص Java ثلاث مصفوفات داخلية طول كل منها أربعة عناصر. تبدأ كل خلية بقيمتها الافتراضية (0 للنوع int). يمكنك أيضًا التهيئة المباشرة باستخدام حرفي المصفوفة:
كل مصفوفة داخلية هي صف. فكّر في scores[1][2] على أنّه "الصف 1، العمود 2" — وهي القيمة 95.
الوصول إلى العناصر
تُفهرس المصفوفة ثنائية الأبعاد بتعبيرَي قوسين: الأول للصف، والثاني للعمود.
scores[1] بحد ذاته من النوع int[] — يمكنك تمريره في أي مكان يتوقّع مصفوفة أحادية البعد. هذا مهم عندما تحتاج إلى معالجة صف بأكمله دفعةً واحدة.
التكرار على مصفوفة ثنائية الأبعاد
حلقات for المتداخلة هي الطريقة المعيارية لزيارة كل خلية. الحلقة الخارجية تسير على الصفوف، والحلقة الداخلية تسير على الأعمدة.
المخرجات:
تعمل حلقة for-each المحسّنة أيضًا، إذ تعامل كل عنصر في المصفوفة الخارجية على أنّه صف:
مثال عملي: شبكة الضرب
لنبنِ جدول ضرب بسيطًا — وهو مثال كلاسيكي على مسائل الشبكات ثنائية الأبعاد:
المخرجات:
length دائمًا — لا تُشفّر الأبعاد يدويًا. اكتب grid.length للصفوف وgrid[0].length للأعمدة. إذا تغيّر حجم المصفوفة لاحقًا، ستظل حلقاتك تعمل دون أي تعديل.
المصفوفات غير المنتظمة (Jagged Arrays)
لا يشترط Java أن تكون جميع الصفوف بنفس الطول. عندما تخصّص المصفوفة الخارجية فقط وتملأ الصفوف يدويًا، تحصل على مصفوفة غير منتظمة (Jagged Array).
المخرجات:
NullPointerException. عندما تخصّص البعد الخارجي فقط (new int[4][])، يكون كل صف null حتى تُسنده. الوصول إلى triangle[1][0] قبل إسناد triangle[1] يُطلق استثناء NullPointerException.
مصفوفات بأكثر من بعدين
يتيح Java ثلاثة أبعاد أو أكثر — فقط أضف أزواجًا إضافية من الأقواس. المصفوفة ثلاثية الأبعاد يمكن أن تمثّل مكعبًا من القيم (مثل بيانات البكسل بعرض وارتفاع وقنوات ألوان).
في الواقع العملي، تغطّي المصفوفات ثنائية الأبعاد الغالبية العظمى من حالات الاستخدام. لا تتجاوز البعدين إلا عندما تكون طبيعة البيانات تستدعي ذلك فعلًا — النموذج الذهني والكود كلاهما يزداد تعقيدًا بسرعة.
الخلاصة
- تُعلَن المصفوفة ثنائية الأبعاد بالشكل
int[][] name = new int[rows][cols]ويُصل إليها بـname[row][col]. - استخدم حلقات متداخلة للتكرار؛ الخارجية للصفوف والداخلية للأعمدة.
- استخدم دائمًا
array.lengthوarray[0].lengthبدلًا من الأرقام المُشفَّرة. - تتيح المصفوفات غير المنتظمة صفوفًا بأطوال مختلفة — خصّص المصفوفة الخارجية أولًا ثم كل صف على حدة.
- لا تصل إلى صف قبل إسناده وإلا ستواجه
NullPointerException.