المصفوفات

المصفوفة هي كائن حاوي، يحتوي على عدد محدد من العناصر ذات صنف واحد. يتم تحديد طول المصفوفة عند إنشائها. بعد الإنشاء، طول المصفوفة يبقى تابثا. لقد سبق ورأينا مثال عن المصفوفات، في الطريقة main لبرنامج "Hello World!". سنقوم الآن بالتعمق أكثر في المصفوفات.

كل قيمة في المصفوفة تسمى "عنصر"، ويتم الوصول لكل عنصر باستعمال مؤشره الرقمي. كما يظهر في الصورة، الترقيم يبدأ من الصفر 0. يتم الوصول للعنصر التاسع مثلا باستعمال المؤشر 8.

البرنامج التالي، ArrayDemo، يقوم بإنشاء مصفوفة من الأعداد الصحيحة، يملأها ببعض القيم، ويطبع قيمة كل عنصر.
class ArrayDemo {
     public static void main(String[] args) {
          int[] anArray;              // إعلان مصفوفة من الأعداد الصحيحة

          anArray = new int[10];      // حجز الذاكرة ل 10 أعداد صحيحة
            
          anArray[0] = 100; // تهيئة العنصر الأول
          anArray[1] = 200; // تهيئة العنصر الثاني
          anArray[2] = 300; // ...
          anArray[3] = 400;
          anArray[4] = 500;
          anArray[5] = 600;
          anArray[6] = 700;
          anArray[7] = 800;
          anArray[8] = 900;
          anArray[9] = 1000;

          System.out.println("Element at index 0: " + anArray[0]);
          System.out.println("Element at index 1: " + anArray[1]);
          System.out.println("Element at index 2: " + anArray[2]);
          System.out.println("Element at index 3: " + anArray[3]);
          System.out.println("Element at index 4: " + anArray[4]);
          System.out.println("Element at index 5: " + anArray[5]);
          System.out.println("Element at index 6: " + anArray[6]);
          System.out.println("Element at index 7: " + anArray[7]);
          System.out.println("Element at index 8: " + anArray[8]);
          System.out.println("Element at index 9: " + anArray[9]);
     }
} 
مخرج البرنامج هو كالتالي :

Element at index 0: 100
Element at index 1: 200
Element at index 2: 300
Element at index 3: 400
Element at index 4: 500
Element at index 5: 600
Element at index 6: 700
Element at index 7: 800
Element at index 8: 900
Element at index 9: 1000

في مواقف برمجية واقعية، سنستعمل في الغالب واحدة من أشكال الحلقات للمرور عبر عناصر المصفوفة، بدل كتابة كل سطر على حدة، كما في المثال السابق. لكن المثال يظهر بوضوح صياغة المصفوفات. سنتعرف على مختلف أشكال الحلقات ( for, while & do-while ) في درس التحكم في السير (سير تنفيذ الشيفرة) .

إعلان متغير يدل على مصفوفة

البرنامج السابق يعلن المصفوفة anArray باستعمال السطر التالي

int[] anArray;              // إعلان مصفوفة من الأعداد الصحيحة

كما الإعلان بالنسبة للمتغيرات من أنواع أخرى، الإعلان عن مصفوفة يحتوي على مكونين: نوع المصفوفة وإسمها. نوع المصفوفة يكتب كالتالي []type ،حيث type هو نوع العناصر داخل المصفوفة؛ الأقواس المربعة هى رمز خاص يبين أن المتغير يحتوي على مصفوفة. حجم المصفوفة ليس جزءا من نوعه (لهذا السبب الأقواس المربعة فارغة).
إسم المصفوفة يمكن أن يكون أي شيء نريد، مادام يحترم القواعد كما المبينة في قسم التسمية. كما المتغيرات من باقي الأنواع، إعلان المصفوفة لا يقوم بإنشائها -- يقوم فقط بالقول للمُجَمِّع أن المتغير سيحتوي على مصفوفة من النوع المحدد.

أيضا، يمكن إعلان مصفوفات من أنواع أخرى:

byte[] anArrayOfBytes;
short[] anArrayOfShorts;
long[] anArrayOfLongs;
float[] anArrayOfFloats;
double[] anArrayOfDoubles;
boolean[] anArrayOfBooleans;
char[] anArrayOfChars;
String[] anArrayOfStrings;

يمكن أيضا وضع الأقواس المربعة بعد إسم المصفوفة:

float anArrayOfFloats[]; // لا ينصح بهذه الطريقة
لكن لا ينصح باستعمال هذه الطريقة؛ الأقواس تميز نوع المصفوفة وبالتالي يفترض أن تظهر بجانب النوع.

إنشاء، تهيئة، والوصول للمصفوفة

إحدى طرق إنشاء مصفوفة استعمال العامل new. السطر التالي من برنامج ArrayDemo ينشئ مصفوفة لها ما يكفي من الذاكرة ل 10 أعداد صحيحة، ويخزن المصفوفة في المتغير anArray.

anArray = new int[10];  // إنشاء مصفوفة من الأعداد الصحيحة
إذا كان هذا السطر غير موجود، فإن المجمع سيطبع رسالة الخطأ التالية، وستفشل عملية التجميع.
	ArrayDemo.java:4: Variable anArray may not have been initialized.
السطور التالية تحدد قيمة كل عنصر من المصفوفة:
anArray[0] = 100; // تهيئة العنصر الأول
anArray[1] = 200; // تهيئة العنصر الثاني
anArray[2] = 300; // ...
يتم الوصول لكل عنصر من المصفوفة باستعمال مؤشره الرقمي:
System.out.println("Element 1 at index 0: " + anArray[0]);
System.out.println("Element 2 at index 1: " + anArray[1]);
System.out.println("Element 3 at index 2: " + anArray[2]);
توجد أيضا طريقة أخرى لإنشاء وتهيئة المصفوفة:
int[] anArray = {100, 200, 300, 400, 500, 600, 700, 800, 900, 1000};
في هذه الحالة، حجم المصفوفة هو عدد العناصر الموجودة بين } و {.

يمكننا أيضا إعلان مصفوفة مصفوفات (تعرف أيضا بمصفوفة متعددة الأبعاد) وذلك باستعمال قوسين مربعين أو أكثر، مثل

String[][] names
ويتم الوصول لكل عنصر باستعمال نفس العدد من المؤشرات.

في لغة البرمجة جافا، المصفوفة متعددة الأبعاد هي ببساطة مصفوفة يحتوي كل عنصر منها على مصفوفة. هذا مختلف عن المصفوفات في C أو Fortran. كنتيجة لذلك، يمكن للسطور أن تكون مختلفة في الحجم، كما هو مبين في البرنامج MultiDimArrayDemo:

class MultiDimArrayDemo {
    public static void main(String[] args) {
        String[][] names = {{"Mr. ", "Mrs. ", "Ms. "},
                            {"Smith", "Jones"}};
        System.out.println(names[0][0] + names[1][0]); //Mr. Smith
        System.out.println(names[0][2] + names[1][1]); //Ms. Jones
    }
}
خارج البرنامج هو:

Mr. Smith
Ms. Jones

وفي النهاية، يمكن استعمال الخاصية length لتحديد حجم مصفوفة ما. الشيفرة التالية:
System.out.println(anArray.length);
ستقوم بطباعة حجم المصفوفة.

نسخ المصفوفات

الفئة System تتوفر على الطريقة arraycopy التي تمكننا من نسخ مصفوفة إلى أخرى بطريقة فعالة.

public static void arraycopy(Object src,
                             int srcPos,
                             Object dest,
                             int destPos,
                             int length)
المعطيان من صنف Object يحددان المصفوفة التي سننسخ منها والمصفوفة التي سننسخ إليها. الثلاث معطيات من نوع int تحدد موقع البداية في المصفوفة الأصل، موقع البداية في المصفوفة الهدف، وعدد العناصر التي سيتم نسخها.

البرنامج التالي، ArrayCopyDemo، يعلن مصفوفة عناصر char، يحتوي على حروف الكلمة "decaffeinated". البرنامج يستعمل arraycopy لنسخ جزء من المصفوفة إلى مصفوفة ثانية:

class ArrayCopyDemo {
    public static void main(String[] args) {
        char[] copyFrom = { 'd', 'e', 'c', 'a', 'f', 'f', 'e',
			    'i', 'n', 'a', 't', 'e', 'd' };
        char[] copyTo = new char[7];

        System.arraycopy(copyFrom, 2, copyTo, 0, 7);
        System.out.println(new String(copyTo));
    }
}
خارج البرنامج هو:

caffein