/Java Programming: Let's Master 6/i

Java Programming: Let's Master 6/i

فى الشابتر دة هنعرف ان شاء الله يعنى اية array و ازاي نتعامل معاها و اهميتها بالنسبة لنا اية فى شغل البرمجة،، ممكن حد يشوف ان الكلام عن الarray كده اتأخر،، بس طبعا دا مقصود،، كان لازم يجي بعد الmethods وال loops عشان معظم عمليات المعالجة اللي بتتم على الarrays بتتم بالloops والmethods..

6.2.ArrayBasics

بفرض اننا عاوزين نسجل 10 ارقام من النوع double و نستخدمهم فى الكود بتاعنا و كلهم لهم علاقة ببعض قبل كدة كنا هنفكر اننا نعرف 10 متغيرات من النوع double و نسجل فى كل متغير القيمة اللى عاوزين نسجلها و طبعا دة صعب طيب بفرض انهم مكانوش 10 متغيرات كانوا مثلا 100 او 1000 متغير اكيد الموضوع هيبقى اصعب بكتير. ال arrays وفرت علينا الموضوع دة يبقى نقدر نقول عن ال array انها مجموعة متغيرات من نفس النوع.

6.2.1.DeclaringArrayVariables

فى الجزء دة هنعرف ازاي نعرف ال array reference
علشان نستخدم ال array فى اي كود لازم الاول نعرف متغير بيكون reference لل array اللى هنستخدمها و نعرف نوع الداتا اللى المؤشر دة بيشاور عليها.
و طريقة تعريف ال array بالشكل دة

 

و الطريقة الاولى الكل بيستخدمها اكتر من التانية و دة مثال لطريقة كتابة الطريقتين:

6.2.2.CreatingArrays

فى الجزء اللى فات عرفنا ال array reference و نوع الداتا اللى هتتخزن فى ال array بس لحد دلوقتى محجزناش مكان فى الميمورى لها يعنى ال reference مش بيشاور على حاجة فى الميمورى و بكدة يبقى قيمتة null و نفهم من كدة ان ماقدرش احط فى ال array اي داتا فى الجزء دة بقى هنتعلم ازاي انشئ ال array (احجزلها مكان فى الميمورى)علشان اقدر استخدمها بعد كدة.
و طريقة حجز مكان فى الميمورى لل reference بالشكل دة

الجملة اللى فاتت بتعمل حاجتين
1.انشئنا ال array باستخدام new dataType[arraySize] و نلاحظ اننا بين الاقواس بنكتب المساحة اللى احنا عاوزينها يعنى لو عاوزين نسجل 10 ارقام فى ال array هيبقى ال arraySize = 10.
2.حددنا reference لل array كنا معرفينة قبل كدة
زي ما شوفنا قبل كدة علشان استخدم array كان لازم اعمل خطوتين الاولى انى اعرف ال reference و ال data type و التانية انى انشئ ال array نفسها احنا ممكن ندمج الخطوتين دول فى امر واحد بالشكل دة

 

و دة مثال يوضحلنا الطريقة دى

 

 

فى الامر اللى فات انشئنا array هيتسجل فيها بيانات من النوع double و قولنا انها مكونة من 10 عناصر و ان ال reference لها اسمة myList.
و الصورة دى توضح المثال اللى فات و متسجل فيها ال 10 قيم

ملحوظة: myList هو فى الحقيقة reference لـ array من النوع double مكونة من 10 عناصر بس احنا ممكن بدل ما نقول كل الكلام دة نقول ان myList هي array و نهمل الفرق بين ال reference و الـ array. ودا طبعا مجازاً بس..

6.2.3.ArraySizeandDefaultValues

اما بنحجز مكان فى الميمورى لل array لازم بنحدد مساحتها باننا نكتب عدد العناصر اللى ممكن نخزنها فيها و بعد ما بيتم انشائها مبينفعش نغير مساحتها و ممكن نعرف مساحة اي array باستخدام arrayRefVar.length فى المثال اللى فات myList.length تساوى 10.
اول ما بننشئ ال array قبل ما نحط فيها القيم اللى عاوزينها بيكون متسجل فيها قيم ابتدائية و هي لو ال array هيتخزن فيها اي نوع من الارقام يبقى 0 انما لو هيتسجل فيها حروف يبقى ‘\u0000’ و لو كانت من النوع Boolean هيتسجل فيها false.

6.2.4.ArrayIndexedVariables

ممكن نتنقل بين عناصر ال array و نستخدم اي عنصر باستخدام ال index و هو بنظام 0-based و دة معناه ان العد بيبدأ من الصفر و نلاحظ ان ال index هو اللى بيتكتب بين الاقواس اللى بالشكل دة[] بعد اسم ال array بالفورم دى

نفهم من الكلام اللى فات ان لو ال array مساحتها arrayRefVar.length يبقى هتبدأ ب 0 و تنتهى بـ arrayRefVar.length-1 فى المثال اللى فات (فى الصورة) mylist فيها 10 عناصر من النوع double يبدئوا من 0 و ينتهوا عند العنصر رقم 9.
بعد ما بننشئ ال array ممكن نستخدم عناصرها باستخدام ال indexed variable زي ما كنا بنستخدم ال variable العادى و دة مثال على الكلام دة

و هنقول مثال تانى هنستخدم فية ال loop عشان نحط قيمة فى كل عنصر من عناصر ال array ال index الخاص بيها يعنى myList[0] هنحط فيها 0 و myList[1] هنحط فيها 1 و هكذا

6.2.5.ArrayInitializers

فى الجافا طريقة مختصرة ممكن بيها نعمل 3 حاجات فى امر واحد نعرف ال array و ننشئها و نحط فيها القيم و دة الشكل بتاع الطريقة دى

و دة مثال عليها

 

الجملة اللى فاتت بتكافئ مجموعة الجمل دى

 بس اكيد الطريقة المختصرة دى مش هتفيدنا لو عدد عناصر ال array كبير  .نلاحظ ان فى الطريقة اللى فاتت ماستخدمناش كلمة new و لازم نعرف ان لو استخدمنا الطريقة دى يبقى لازم نعرف ال array و ننشئها و نحطلها القيم كل دة فى جملة واحدة انما لو عملنا الحاجات دى على اكتر من جملة هيبقى syntax error و البرنامج مش هيشتغل زي الكود اللى هنقولة دة كود خطأ


 

6.2.6.ProcessingArrays

احنا لو عاوزين نعمل اي عمليات على عناصر ال array بنستخدم ال for loop و دة لسببين مهمين
*لان كل عناصر ال array من نفس النوع و اي فى اغلب الاحوال اي عملية بتتم عليهم بتكون بنفس الطريقة باستخدام التكرار
*لان حجم ال array بيكون معروف من الاول فطبيعى اننا نستخدم ال for loop.
و دة مثال يبينلنا ازاي نحط قيم عشوائية فى ال array

 

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

فى المثال اللى فات طبعنا ال array و كانت من النوع double و كان لازم نستخدم الloop  لكن لو عندنا array من النوع char ممكن اطبعها على طول باستخدام امر الطباعة بالطريقة دى :

 

هنقول مثال تانى نجمع كل عناصر ال array و نحط الناتج فى متغير من النوع double و اسمة total فى الاول حطينا لة قيمة ابتدائية 0 و مع تكرار اللوب هنبدأ نجمع العناصر لل array عنصر عنصر من ال index يساوى 0 لحد نهايتها (حجمها – 1 )

و دة مثال تانى علشان نطلع اكبر عنصر من عناصر ال array و فية هنعرف متغير من النوع double بردو اسمة max لة قيمة ابتدائية تساوى قيمة اول عنصر فى ال array دة اللى هيتسجل فية اكبر قيمة لعنصر من عناصر ال array و هنقارن المتغير دة بكل عناصر ال array باستخدام اللوب لو قيمة عنصر ال array اكبر من المتغير هنسجل قيمة العنصر فى المتغير و ننتقل للعنصر اللى بعدة لو اقل مش هنعمل حاجة و نتنقل للعنصر اللى بعدة و هكذا

احنا ممكن نعدل فى الكود اللى فوق بحيث اننا نسجل ال index بتاع اكبر رقم و هيبقى الكود بالشكل دة

 

نلاحظ فى الكود اللى فات ان لو اكبر قيمة لعنصر اتكررت فى ال array المتغير indexOfMax هيتسجل فية ال index الاصغر ما بينهم يعنى بفرض ان myList[3] = 33.5 و myList[7]=33.5 و كانت 33.5 اكبر قيمة يبقى المتغير indexOfMax هيتسجل فية 3.

6.2.7.foreachLoops

فى ال JDK 1.5 ظهر شكل جديد من ال for loop معروف باسم foreach loop او enhanced for loop و دة ممكن اما نستخدمة نعمل العمليات على كل عناصر ال array من غير ما نستخدم ال index. و دة الشكل العام لها

و دة مثال يوضحلنا ازاي نطبع كل عناصر ال array باستخدام foreach

 

فى المثال اللى فات ممكن نقرى الكود بالشكل دة (لكل عنصر من عناصر myList اطبع العنصر دة) المتغير element لازم ياخد نفس ال data type زي ال array نفسها.

6.2.8.Example:TestingArrays

دة مثال بياخد 6 قيم من المستخدم من النوع integer و البرنامج بيحدد اكبر قيمة و عدد تكرارها فى ال6 ارقام

و هيكون دة شكل ال messages اللى اليوزر هيتعامل معاهم

6.2.9.Example:AssigningGrades

دة مثال تانى بيحسب تقديرات الطلاب, فى الاول اليوزر هيدخل عدد الطلاب بعد كدة هيبدأ ادخال الدرجة لكل طالب من 100 البرنامج بعد كدة هيعرف اعلى درجة من الدرجات اللى اليوزر دخلها بعد كدة يحسب تقديرات الطلاب بالنسبة للدرجة دى على حسب المعلومات اللى هنقولها

اعلى درجة – 10 تقدير A
اعلى درجة – 20 تقدير B
اعلى درجة – 30 تقدير C
اعلى درجة – 40 تقدير D
اقل من كدة تقدير F
بعد كدة هتظهر رسالة للمستخدم بأرقام الطلاب و درجة كل طالب و التقدير
و دة الكود

و دى شاشات التعامل مع اليوزر

6.3.CopyingArrays

بفرض اننا عاوزين ننسخ array ممكن نستخدم ( = ) بالطريقة دى
List2 = list1;
بس الطريقة دى فى الحقيقة مش بتنسخ ال array هي بتخلى ال reference اللى اسمة list2 يشاور على ال array فى الميمورى اللى بيشاور عليها ال reference اللى اسمة list1 و بكدة يبقى ال array اللى كان بيشاور عليها list2 مفيش reference بيشاور عليها و بقت مجرد مساحة مشغولة فى الميمورى مش بنستفيد منها و بيتم حزفها لوحدها من ال garbage collector فى ال Java Virtual Machine يبقى list1 و list2 بيشاوروا على array واحدة مش 2 array و طبعا كدة لو غيرنا حاجة فى list1 هنلاقي نفس الحاجة اتغيرت فى list2
و الصورة دى هتوضح الكلام اللى قولناه

ولاكن فى 3 طرق تانية ممكن بيها ننسخ ال arrays
•نعمل لووب و ننسخ عنصر عنصر من عناصر ال array.
•فى ميثود موجودة فى System class اسمها arraycopy بتمكنا اننا ننسخ ال array.
•ممكن نستخدم clone method لنسخ ال arrays بس لسة هنعرفها فى شابتر 9.
الكود دة هيبينلنا ازاي نستخدم اللوب لنسخ ال array

و دة شكل ال arraycopy method يبين ال arguments بتاعتها

sourceArray هنا بنكتب اسم ال array اللى عاوزين ننسخها
srcPos هنا بنكتب اول عنصر عاوزين نبدأ فى نسخة
targetArray وهنا بنكتب اسم ال array الجديدة
tarPos هنا بقى بنكتب اول عنصر هيبدأ فية التسجيل فى ال array الجديدة
length دة عدد العناصر اللى هننسخها
لو استخدمنا الطريقة دى فى نسخ ال arrays لازم ناخد بالنا ان ال array الجديدة لازم نعرفها و نحدد حجمها قبل استخدامها فى الميثود.

6.4.PassingArraystoMethods

زي ما كنا بنبعت variables من اي نوع لل methods بردو ممكن نبعت ال arrays لل method و دة مثال ل array بتطبع عناصر array من النوع integer.

و الامر اللى هنكتبة هننادى فية ال method اللى عملناها و نلاحظ ان ال array اللى بعتناها مالهاش reference لاننا مش هنستخدمها فى الكود مرة تانية.

 

اما بنبعت ال variables العادية لل method بنبعت القيمة بس و دة بيبقى اسمة Pass by value انما لو بعتنا array هنبعت ال reference نفسة بتاع ال array و دة بيبقى اسمة Pass by reference
المثال دة بيوضح الكلام اللى فات

فى المثال اللى فات دة عملنا ميثود اسمها m بتستقبل 2 arguments الاول integer و التانى reference ل array من النوع integer و المفروض انها بتغير قيمة المتغير الاول للقيمة 1001 و بتغير قيمة اول عنصر من عناصر ال array للقيمة 5555 و ملهاش return اما نعملها call فى ال main method هنلاقى ان بعد ما اتنفزت قيمة المتغير الاول ماتغيرتش انما قيمة العنصر الاول فى ال array اتغيرت و دة بسبب انها call-by-reference يعنى لو غيرنا حاجة فى ال array بداخل الميثود ال array الاصلية هتتغير.
ملحوظة: ممكن نبعت عنصر من عناصر ال array لميثود و هنتعامل معاه كأنة متغير عادى و مش كأنة عنصر فى array
و دة مثال هيوضحلنا فكرة الموضوع كلة هو فية 2 ميثود تبديل ارقام الاولى بتاخد متغيرين من النوع integer بتبدل قيمهم و الثانية بتاخد array من النوع integer بتبدل قيمة اوى عنصرين بردو ونشوف الكود

و هيكون دة شكل ال output

نلاحظ ان اما بعتنا اول عنصرين فى ال array كانهم متغيرات عادية للميثود قيمة العناصر اتغيرت فى الميثود بس انما فى بقية الكود قيمتهم ماتغيرتش و دة لان الميثود حجزت مكان فى الميمورى للمتغيرات الخاصة بيها يبقى اما هتغير قيمة اي حاجة هتتغير فى الميمورى الخاصة بالميثود انما الميمورى الاصلية مش هتتغير, انما اما بعتنا ال reference لل array و غيرنا قيمة اول عنصرين قيمة اول عنصرين اتغيرت فى الكود كلة لان بالطريقة دى الميثود بتغير فى الميمورى الاصلية بتاعة ال array.

6.5.ReturninganArrayfromaMethod

احنا اتكلمنا على ازاي نبعت array للـ methods دلوقتى هنتكلم ازاي نعمل return لــ array فى ال method
دة كود هيوضحلنا ازاي نعمل return ل array فى الكود دة عبارة عن method بتستقبل array و تقلبها و ترجع ال array مقلوبة

نلاحظ اننا عملنا return للـ reference بتاع ال array اللى عملناها جوا الميثود و علشان نستخدم الميثود دى لازم اننا نستقبل ال return دة فى reference لـ array من نفس النوع بالشكل دة

6.5.1.Example:CountingtheOccurrencesofEachLetter

دة مثال فى الاول بينشئ 100 حرف عشوائى و بعد كدة بيحسب و عليك :
•اول خطوة اننا هنكتب ال 100 حرف و نسجلهم فى array مكونة من 100 عنصر باستخدام الميثود getRandomLowerCaseLetter() اللى موجودة فى الكلاس RandomCharacter
•احسب عدد تكرار كل حرف و اسجلة بردو فى array مكونة من 26 عنصر(عدد حروف اللغة الانجليزية)
و الصورة دى هتبينيلنا ال arrays اللى هنستخدمها :

و دة الكود :

و دة شكل الناتج :

شرح طريقة عد الحروف: احنا بنمر على كل حرف من ال 100 حرف و بنطرح حرف ال a من كل حرف و ناتج الطرح اكيد هيرجعلنا ترتيب الحرف فى الحروف الابجدية بفرض الحرف كان c يبقى c – a = 2 و بكدة نزود counts[2] بواحد لانها هي اللى بتدل على تكرار الحرف c و بنعمل كدة لكل الحروف الطريقة دى وفرت علينا كتييييير اوى لان لو ماستخدمنهاش كان هيبقى البديل اننا نمر على كل حرف ونشوفة يساوى a ولا يساوى b ولا يساوى c…………… لنهاية الحروف

6.6. Variable-Length Argument Lists

فى JDK 1.5 ممكن نبعت ل method مجموعة arguments عددها مش محددينة بشرط انهم يكونوا من نفس النوع و بنعمل كدة باننا بنزود 3 نقط بعد نوع ال argumentss باستخدام الطريقة دى
typeName… parameterName
فى الحالة دى الـ arguments بيبقى اسمها Variable-Length Argument و ال جافا بتتعامل معاها كانها array فهي اما بتلاقى اننا استخدمنا الموضوع دة بتنشئ array و تحط فيها قيم المتغيرات اللى بعتناهلها مع اختلاف اننا ممكن نبعت للميثود مجموعة متغيرات عادية باي عدد او نبعتلها array
و دة مثال هيوضحلنا الموضوع :

إحنا لحد هنا اتكلمنا عن الarrays  بشكل تفصيلي واتكلمنا عن معظم عمليات المعالجة اللي بتتم عليها ودا كان الجزء الأول من الدرس السادس.. والمرة الجاية في الجزء التاني هيكون معادنا مع العمليات الأكثر تعقيدا في التعامل مع الarrays زي ترتيب array  أو البحث على عناصر داخل array ودي مجموعة algorithms مهمة جدا عشان تبقى محترف في التعامل مع الarrays وطبعا الalgorithms والتيكنيكات دي لا غنى عنها في سوق العمل أو القوالب التجارية للبرمجيات..

Thanks a lot CATReloaded

Thanks a lot CATaZine

Om4rezz