المصفوفات في لغة جافا | Arrays in Java


(عمار الخوالدة) #1

###السلام عليكم ورحمة الله وبركاته …
####سأشرح اليوم المصفوفات في لغة جافا وسنتعرف عليها بالتفصيل بإذن الله


فهرس الموضوع :

  • أولا : ما هي المصفوفات .
  • ثانيا : فهم مبدأ المصفوفات .
  • ثالثا : تعريف واستخدام المصفوفة برمجيا .
  • رابعا : جملة For Each .
  • خامسا : المصفوفات متعددة الأبعاد .
  • سادسا : مراجع مفيدة .

أولا : ما هي المصفوفات .

المصفوفة هي عبارة عن كائن يحتوي عدد من الكائنات من نوع واحد تخزنها في الذاكرة ، وتستطيع تشبيهها بمتغير بأكثر من قيمة .


ثانيا : فهم مبدأ المصفوفات .

بما أن المصفوفة هي عبارة عن كائن يحتوي أكثر من قيمة ، وجب توفير رقم يدل على القيمة المطلوبة عند تحديد هذه القيمة في الذاكرة أو عند استدعائها ، وبناءً على ذلك يوجد لكل قيمة رقم خاص يدل عليه ، حيث يبدأ الترقيم في المصفوفة من الرقم صفر (0) .

يمكنك أن تشبه المصفوفة بالجدول بهذا الشكل :

لاحظ أن الجدول اللذي رسمناه يبدأ الترقيم فيه من الرقم 0 وينتهي ب 4 بالتالي فسيتكون هذا الجدول من خمسة عناصر وكذلك بالنسبة للمصفوفات

ملاحظة : يوجد نوع اخر من المصفوفات سيتم توضيحه لاحقا وهو المصفوفات متعددة الابعاد لكن الآن سنركز على فهم المصفوفة العادية .


ثالثا : تعريف واستخدام المصفوفة برمجياَ .

أولا يجب ان تعرف أن المصفوفة يجب أن يكون لها نوع (Data type) وهذا النوع هو ما سيحدد نوع العناصر اللتي سيحتويها ، فكما ذكرنا سابقا المصفوفة هي كائن تحتوي عدد من الكائنات من نوع واحد ، ولذلك عند تعريف المصفوفة يتم تحديد ذلك النوع .

انظر إلى طريقة التعريف :

int x[] ;

لاحظ أننا عندما نعرف متغير عادي نقوم بتحديد نوع المتغير ثم اسمه ، لكن انتبه إلى الأقواس المربعة ، هذه الأقواس هي اللتي تبين أن هذا الكائن هو مصفوفة وليس متغيرا عادياَ .

يوجد أكثر من طريقة للتعامل مع المصفوفة :

  • تحديد عدد عناصر المصفوفة :

ويتم بهذه الطريقة

int x[] = new int[4];

كلمة new في الكود تدل على أننا ننشئ مساحة جديدة لقيم المصفوفة في الذاكرة وهي من نوع int بـ 4 قيم من نفس النوع .

ملاحظة : لا تقم بالخلط بين عدد عناصر المصفوفة وبين رقم اخر قيمة فيها فهذه المصفوفة في المثال السابق هي عبارة عن مصفوفة تتكون من أربعة عناصر بمعنى أن ترقيم عناصرها يبدأ بالرقم 0 وينتهي بالرقم 3 .

لتحديد قيم هذه العناصر الأربعة قم بتحديد الترقيم بداخل الأقواس مثال :

x[0] = 46;
x[1] = 31;
x[2] = 70;
x[3] = 12;

هكذا يتم تحديد قيم عناصر المصفوفة واستدعاء أي عنصر يتطلب كتابة اسم المصفوفة مع وضع رقم العنصر بين الأقواس ، لتتأكد بنفسك قم بكتابة هذا الكود :

System.out.println(x[2]);

سيكون ناتج الطباعة هو 70 .

يوجد طريقة أخرى لتحديد قيم المصفوفة أثناء التعريف كالتالي :

int x[] = {46,31,70,12};

وسيكون الترتيب بنفس الطريقة السابقة بالتعداد من صفر إلى 3 لأننا وضعنا 4 عناصر .

يمكنك أيضا تعريف أكثر من مصفوفة في وقت واحد كما تفعل عند تعريف المتغيرات :

int x[],y[] ;

لكن ربما سيزعجك كتابة الأقواس كثيرا لذلك يمكنك أن تستبدل الطريقة السابقة بهذه الطريقة وكلا الطريقتين صحيحتين وستؤديان نفس العمل :

int [] x,y;

لكن ماذا لو كان لدي مصفوفة كبيرة جدا تحوي 100 عنصر مثلا كيف سأقوم بطباعتها ؟

جواب هذا السؤال في الجزء التالي من الموضوع :wink: .


رابعا : جملة For Each .

هي حالة خاصة من جملة for تستخدم للتعامل مع المصفوفات ، شاهد المثال الآتي وسيتم شرح كل كود بالتفصيل :

int x[] = {24,52,76};

for(int val : x){

System.out.println(val);

}

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

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

الخانة الثانية نضع المصفوفة التي نريد ادراج عناصرها في المتغير في الخانة الأولى .

نتيجة تنفيذ الأمر :

ملاحظة : يمكنك أيضا استخدام for بشكل عادي لاستدعاء عناصر المصفوفة لكن هذه الطريقة أسهل وأسرع .


خامسا : المصفوفات متعددة الأبعاد .

المصفوفات متعددة الأبعاد هي باختصار عبارة عن مصفوفة عناصرها عبارة عن عدد من المصفوفات وكلها من نفس النوع ، بمعنى أننا نستبدل كل عنصر بداخل المصفوفة الرئيسية بمصفوفة أخرى .

انظر إلى الكود لتفهم الموضوع أكثر :

int [] [] x = { {4,3} , {7,11} } ;

System.out.println(x[0][1]);
System.out.println(x[1][1]);
System.out.println(x[0][0]);
System.out.println(x[1][0]);

لاحظ أننا استبدلنا كل عنصر من عناصر المصفوفة x بمصفوفة بالتالي اصبح لدينا مصفوفة بهذا الشكل :

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

ولفهم الأمر بشكل كامل انظر إلى ناتج تنفيذ الكود في الأعلى :


سادسا : مراجع مفيدة .


(على ) #2

هل يفضل تحديد عدد عناصر المصفوفة ؟

شكرا لك وبارك الله فيك


(عمار الخوالدة) #3

العفو اخي علي .

أجل في جافا يجب تحديد عناصر المصفوفة أو عدد عناصر المصفوفة أثناء التعريف ولا يمكن تغيير عدد العناصر بعد تحديدها .

في بعض اللغات الأخرى يمكنك عمل ما يسمى Unlimited array حيث تكون لا نهائية وتستطيع اضافة العدد اللذي تريده من العناصر إن لم تخني ذاكرتي .

####لكن في حال لم تكن متأكدا من عدد العناصر اللتي تحتاجها استطيع اعطاءك حلين لهذه المشكلة :

  • جعل عدد عناصر المصفوفة كمتغير يقوم المستخدم بتحديد قيمته . مثال :
/*
        تقوم بجعل المتغير يساوي اختيار المستخدم 
        أو أن تكون قد جعلت المتغير يساوي شيئا معينا
        قمت بتحديده كعملية حسابية معينة أو غير ذلك
        أما اذا تركته هكذا من غير قيمة فسيحدث لديك خطأ يمنعك من تشغيل البرنامج
        */
int x;

int arr[] = new int[x];
  • الحل الأول لن ينجح ان اضطررت إلى جعل المصفوفة تستوعب عدد اكبر من العدد اللذي حددته بعد تعريفها لذلك يمكنك عمل مصفوفة اخرى بحجم اكبر وادراج عناصر المصفوفة الأولى في المصفوفة الثانية . مثال :
int arr1[] = new int[4];
        
        arr1[0] = 51;
        arr1[1] = 36;
        arr1[2] = 78;
        arr1[3] = 12;
        
        /*
         يمكنك وضع شرط يتحقق ما اذا كنت تحتاج المزيد من العناصر
         عندما يكون الشرط صحيحا نفذ الاوامر التالية
         اللتي تقوم بانشاء مصفوفة اخرى ومساواة
         عناصر المصفوفة الأولى بالمصفوفة الثانية
                */
       
        int arr2[] = new int[10];
        
        for(int i = 0 ; i < arr1.length ; i++){
            arr2[i] = arr1[i] ;
        }
        
        /*
        هذا الكود لطباعة عناصر المصفوفة الأولى
        والمصفوفة الثانية ويفصل بينهما فاصل
        ستلاحظ وجود اصفار في النهاية بسبب عدم تحديد قيم باقي عناصر
        المصفوفة الثانية مما سيمكنك
        من اضافة عناصر اخرى اليها
        */
        for(int val:arr1)
            System.out.println(val);
        
        System.out.println("---------");
        
        for(int val : arr2)
            System.out.println(val);



(عبدالله) #4

###وجدت حل لها …ربما معقد للمبتدئين لكن فعال …

Use a List<String>, such as an ArrayList<String>. It's dynamically growable, unlike arrays (see: Effective Java 2nd Edition, Item 25: Prefer lists to arrays).

import java.util.*;
//…

List list = new ArrayList();
list.add(“1”);
list.add(“2”);
list.add(“3”);
System.out.println(list); // prints “[1, 2, 3]”


(على ) #5

فعلا معقد لنا قوم المبتدائين ههه

بارك الله فيك


(عبدالله) #6

هههههههههه توي انتبه لردي واشوفه محيوس …تم التعديل :joy:


(عمار الخوالدة) #7

في البداية ما فهمت شيء من اللي كتبته :grin:


#8

السلام عليكم
سؤالين عن المصفوفات

الاول : هل يمكن ان تكون بعض خانات المصفوفة خاليه ؟
بمعنى لو عرفنا مصفوفة من 10 عناصر هي عناصر تؤخذ من اليوزر وتتوقف عند شرط معين … بمعنى انه حجزنا للمصوفه 10 خانات ولكن ملئناها ب خمسه لتحقق شرط التوقف … هل يجوز ذلك ؟؟

الثاني : كيف نعرف مصفوفة ثنائية من النوع String لا نعرف ما هي عناصرها لان الخانه الاولى سناخدها من اليوزر والخانه الثانية ستكون بعد عملية تشفير …
كيف سيكون تعريف هذه المصفوفه
و كيف سيتم طباعة عناصرها ؟
ام يمكن ان نعمل مصفوفتين منفصلتين يكون اسهل ؟
كيف سيتم ذلك ؟
وشكرا


#9

السؤال ، الاول : لا ، لايمكن ذلك المصفوفة تعرف بعناصرها وإلا فإنها ستكون ][ فارغه اي لا تساوي ولا تعود الى اي قيمه .

السؤال الثاني : أعتقد أنه يجب ان تبحث عن شيء يدعى dictionary ,او ابحث عن تقنية Json


(وفاء) #10

السلام عليكم عندي سوال اذا عندي مصفوفه مكونه من 3 صفوف و4 اعمده وابغا الصف الاول ناتجه مضروب في 1 والصف التاني ناتجه مضروب في 2 والصف الثالث ناتجه مضروب في ثلاثه
انشات المصفوفه بس بقي عليا اسوي خطوة الضرب ممكن اعرف كيف


(mohamedfawzy) #11

نعم اخى هذا صحيح بالفعل


(heba) #12

سلام عليكم
اريد كتابة كود بالجافا لمعرفة الاتحاد والتقاطع لمجموعتين