التعامل مع البيانات المخزنة في المتغيرات الأولية لجافا (int, double, char,…إلخ) يعتبر أمراً سهلاً وبسيطاً مقارنةً بالتعامل مع البيانات المخزنة في المصفوفات.
كم من مرة احتجت لإعادة كتابة نفس الأسطر البرمجية من أجل التعامل مع شيء يتعلق بالمصفوفات؟
وهنا دعني اتساءل!! ما هو أسلوبك مع الدوال: هل أنت المبرمج الذي يحفظ أم المبرمج الذي يبحث؟
قلّةُ الأسطُر البرمجية مع وضوحها عاملٌ من عوامل جودة الشفرة المصدرية، أو فلتقل هذه هي البلاغة البرمجية، وهي ليست هدفاً في حد ذاتها ولكن أهميتها في أنها أيضاً عاملٌ مهم في سرعة صيانة النظام وسهولة فهمه من قبل المبرمجين الآخرين في الفريق.
في هذه التدوينات سترى بعض الدوال المتعلقة بالمصفوفات والتي توفّرُ لك وقتك الثمين وتقللُ عدد أسطرك البرمجية.
(1) ترتيب المصفوفة
قد يتطلب منطق البرنامج أن تعيد ترتيب المصفوفة بعد تعبئتها بالبيانات المطلوبة، مثل أن تريد ترتيب درجات طلاب أو مداخيل شهرية أو عمليات حسابية أو غير ذلك.
إذا كانت لديك مصفوفة غير مرتبة وأردت ترتيبها بشفرة مصدرية عادية قد تكون كما يلي
for (int i = 0; i < array.length; i++) { for (int j = i + 1; j < array.length; j++) { if (array[j] < array[i]) { int temp = array[i]; array[i] = array[j]; array[j] = temp; } } }
أما إذا استخدمت الدالة sort من صنف Arrays فإن الشفرة المصدرية تتحول إلى ما يلي فقط
Arrays.sort(array);
(2) البحث عن عنصر في المصفوفة
من أكثر المهام التي يؤديها البرنامج عندما يتعلق الأمر بالييانات. حيثُ يعتبر البحث متطلب سابق لأداء المهمة المقصودة، مثل البحث عن العنصر الأصغر لوضعه في بداية المصفوفة وما شابه ذلك.
إذا أردت البحث عن عنصر في مصفوفة قد تكون شفرتك البرمجية كما يلي
int count = 0; int targetNumber = 5; for (int element : array) { if (element == targetNumber) { System.out.println("Found normally in " + count); break; } count++; }
أما باستخدام دالة search في الصنف Arrays تكون شفرتك المصدرية كما يلي فقط
System.out.println("Found by binary search in index " + Arrays.binarySearch(array,5));
(3) تعبئة المصفوفة برقم محدد
وضع القيم الابتدائية المكررة في مصفوفة ليس أمراً معتاداً جداً. ولكن بالرغم من ذلك كتابةُ الشفرة المصدرية لأداء نفس المهمة عدة مرات أراهُ أمراً مؤلماً.
فإذا أردت تعبئة مصفوفة بالرقم 10 مثلاً قد تكون شفرتك المصدرية كما يلي
for (int i = 0; i < array.length; i++) { array[i] = 10; }
أما عندما تستخدم دالة fill في الصنف Arrays تكون شفرتك المصدرية كما يلي
Arrays.fill(array, 10);
(4) نسخ العناصر من مصفوفة إلى أخرى
نسخ المصفوفات من المهام المتكررة كذلك. خاصة عند الرغبة في المحافظة على البيانات بصورة مؤقتة قبل التعديل على المصفوفة الأصلية.
لنسخ عناصر المصفوفة من واحدة إلى أخرى قد تكون شفرتك المصدرية كما يلي
int[] array1 = new int[10]; int[] array2 = new int[10]; array1 = fillArrayRandomly(array1); for (int i = 0; i < array1.length; i++) { array2[i] = array1[i]; }
ولكن مع استخدام دالة copyOf من صنف Arrays تتحول إلى
int[] array1 = new int[10]; int[] array2 = new int[10]; array1 = fillArrayRandomly(array1); array2 = Arrays.copyOf(array1, array1.length);
(5) المقارنة بين عناصر مصفوفتين
للمقارنة بين عناصر أو بيانات مصفوفتين تحتاج إلى المرور على جميع عناصر المصفوفة. مهمةٌ متكررة وشفرةٌ مصدرية متكررةٌ كذلك.
إذا أرت أن تكتب شفرةً مصدرية لذلك قد تكون كما يلي
int[] array1 = {1,2,3,4,5}; int[] array2 = {1,2,3,4,7}; boolean isEqual = true; for(int i = 0; i< array1.length; i++){ if(array1[i] != array2[i]){ isEqual = false; break; } } System.out.println("Result is " + isEqual);
أما باستخدام دالة equal من صنف Arrays تصبح شفرتك المصدرية من البساطة كما يلي
int[] array1 = {1,2,3,4,5}; int[] array2 = {1,2,3,4,7}; boolean isEqual = Arrays.equals(array1, array2); System.out.println("Result is " + isEqual);
لم أذكر لك في هذه التدوينة كُل الدوال التي توجد في الصنف Arrays، وإنما بعضُ الدوال التي أرى أنها مهمةً جداً لك وتوفّرُ لكَ وقتك بـ:
- عدم إعادة اختراع العجلة. لا داع لكتابة شفرة مصدرية لمشكلة توجد لها دالة جاهزة.
- أنها تساعدك على التغلب على مشاكل تحتاج إلى التغلب عليها كمبرمج بصورة متكررة.
- يمكن الاطلاع علي امثلة اخري عن المصفوفات.
من المواضيع البرمجية الشيقة التي قد تثير اهتمامك هي المقروئية وتأثيرها على شفرتك المصدرية.
جميل جدا..شكرا لك
هل من الممكن ان تساعدني اخي الكريم في حل سؤالي و هو ان اكتب برنامج بلغة c++ باستعمال stack للتحويل من صيغة infix الى postfix مع الشرح و شكرا على جهودك
عذراً احلام، ليس من أهداف المدونة حل المسائل، ولكن بامكانك وضعها في حال أراد أحد القراء المساعدة.
مشكور,
في قسم Arrays.equal لم تكتب الجمله
int[] array1 = {1,2,3,4,5};
int[] array2 = {1,2,3,4,7};
boolean isEqual = true;
if(Arrays.equal(array1,array2){
System.out.println(“Result is ” + isEqual);}
else{
System.out.println(“Result is false”)
}
شكراً لك معتصم 🌼 أسعدتني ملاحظتك
تمت إضافة الجزء المفقود.
الله يجزيك الخير أستاذ مصطفى
وجزاك صديقنا غازي.
بارك الله فيك
وفيك بارك
شكراً لكم
مرحباً بك دوماً.