التكرار على المصفوفات ومعالجتها
التكرار على المصفوفات ومعالجتها
تعرّفتَ في الدرس السابق على كيفية تعريف المصفوفات وملئها. الآن يأتي دور المهارة العملية: المرور على كل عنصر لقراءته أو تعديله أو البحث فيه، واستخدام صنف الأداة المدمج java.util.Arrays حتى لا تضطر إلى إعادة تنفيذ العمليات الشائعة من الصفر.
التكرار على المصفوفات
تمنحك Java ثلاث طرق طبيعية للتكرار على المصفوفة. فهم متى تستخدم كل طريقة هو ما يميّز الكود المقروء عن الكود الفوضوي.
1. حلقة for الكلاسيكية — استخدمها حين تحتاج إلى الفهرس (رقم الموضع).
تُعيد scores.length دائمًا العدد الإجمالي للعناصر. لاحظ أن الشرط هو i < scores.length لا i <= scores.length — الفهارس الصحيحة تمتد من 0 حتى length - 1.
scores.length أو أي فهرس سالب. تحقّق دائمًا من حدود حلقتك.
2. حلقة for المحسّنة (for-each) — استخدمها حين تحتاج القيمة فقط دون الموضع.
تُقرأ هذه الصيغة كالتالي: "لكل score في scores". إنها أقصر وتُلغي خطر تجاوز الحدود بالكامل. المقايضة هنا أنك لا تستطيع تعديل المصفوفة من خلال متغير الحلقة — التغييرات على score داخل الحلقة لا تؤثر في المصفوفة الأصلية.
3. تعديل العناصر — يجب استخدام صيغة الفهرس.
صنف الأداة Arrays
يأتي صنف java.util.Arrays مع JDK ويوفّر توابع جاهزة ومُحسَّنة لأكثر مهام المصفوفات شيوعًا. استورده مرة واحدة في أعلى ملفك:
Arrays.toString — طباعة المصفوفة
لو حاولت System.out.println(scores) مباشرةً طبعت Java شيئًا كـ [I@6d06d69c — وهو عنوان الذاكرة لا القيم. يُعطيك Arrays.toString() تمثيلًا مقروءًا:
Arrays.sort — فرز المصفوفة
يفرز Arrays.sort() المصفوفة في موضعها (يعدّل المصفوفة الأصلية). للأنواع الأولية يستخدم خوارزمية فرز سريع ثنائي المحور — سريعة للغاية عمليًا.
يمكنك أيضًا فرز نطاق جزئي فقط دون المساس ببقية المصفوفة:
Arrays.fill — ملء المصفوفة بقيمة واحدة
بدلًا من التكرار يدويًا لتهيئة كل خلية، يُنجز Arrays.fill() المهمة بنداء واحد:
Arrays.copyOf — إنشاء نسخة بحجم مختلف
ينشئ Arrays.copyOf(original, newLength) مصفوفة جديدة تمامًا. إذا كان newLength أكبر من الأصل تُملأ الخانات الإضافية بالصفر؛ وإذا كان أصغر تُبتر النتيجة.
original.length لاحقًا. Arrays.copyOf() هو النمط المعياري لـ"تغيير حجم" المصفوفة بإنتاج مصفوفة جديدة تحمل البيانات المطلوبة.
Arrays.binarySearch — البحث في مصفوفة مرتّبة
بمجرد ترتيب المصفوفة يمكنك البحث فيها بزمن O(log n) باستخدام البحث الثنائي بدلًا من مسح كل عنصر:
إن لم تُوجد القيمة يُعيد binarySearch رقمًا سالبًا. يجب أن تكون المصفوفة مرتّبة مسبقًا قبل استدعاء هذا التابع — استدعاؤه على مصفوفة غير مرتّبة يُعطي نتائج غير متوقعة.
Arrays.binarySearch() على مصفوفة غير مرتّبة والحصول على نتيجة خاطئة أو سالبة. إن لم تكن متأكدًا من ترتيب المصفوفة استدعِ Arrays.sort() أولًا.
مثال شامل
الخلاصة
استخدم حلقة for الكلاسيكية حين تحتاج الفهرس، وحلقة for-each المحسّنة حين تحتاج القيم فقط. يوفّر صنف Arrays توابع sort وfill وcopyOf وtoString وbinarySearch — كلها مُحسَّنة ومختبرة، لذا فضّلها على كتابة حلقاتك الخاصة لهذه المهام. في الدرس التالي ستنتقل إلى المصفوفات متعددة الأبعاد وترى كيف تنطبق هذه الأدوات نفسها على صفوف وأعمدة البيانات.