مرور المصفوفات (Array Traversals)
| English | العربية |
|---|---|
| traversal/træˈvɜːsl/ | المرور |
| enhanced for loop/enˈhænst fɔː luːp/ | حلقة for المعززة |
زيارة كل عنصر
- المرور (Traversal) يزرع كل عنصر في مصفوفة، عادةً بالترتيب.
- الحلقة المعيارية المؤشرة:
for (int i = 0; i < a.length; i++) { ... a[i] ... } iينتقل من0إلىlength - 1، لذا يصلa[i]إلى كل عنصر مرة واحدة.- المرور هو أساس جميع خوارزميات المصفوفات.
حلقة for-each
- حلقة for المعززة (for-each) تزرع كل قيمة بدون فهرس:
for (int x : a) { ... x ... }←xتأخذ قيمة كل عنصر بالتتابع.- أنظف عندما تحتاج فقط إلى القيم، لا مواقعها.
- لكن لا يمكنها تعديل المصفوفة أو استخدام الفهرس.
الحلقة المؤشرة مقابل for-each
- استخدم الحلقة المؤشرة عندما تحتاج إلى الموقع
i، أو لتعديل العناصر. - استخدم حلقة for-each عندما تريد فقط قراءة كل قيمة.
a[i] = 0;تحتاج الحلقة المؤشرة؛ بينما جمع القيم يمكن أن يستخدم for-each.- كلاهما يزرع كل عنصر — اختر ما يناسب المهمة.
حدود مرة أخرى
- شرط الحلقة المؤشرة
i < a.lengthيحافظ على صحةi. i <= a.lengthتتجاوز بمقدار واحد → ArrayIndexOutOfBoundsException.- حلقة for-each لا يمكنها الخروج عن الحدود — فهي تدير النطاق لك.
- عندما تكتب الفهرس بنفسك، فأنت مسؤول عن الحدود.
حلقة for-each تقرأ القيم لكنها لا تستطيع إعادة التعيين داخل المصفوفة. for (int x : a) { x = 0; } يغير فقط النسخة المحلية x، وليس a — لتصفير المصفوفة تحتاج الحلقة المؤشرة a[i] = 0;. استخدم for-each لـ القراءة، والحلقة المؤشرة لـ التعديل أو عندما تحتاج إلى الموقع i.
طريقتان لجمع عناصر المصفوفة:
- مؤشر:
for (int i = 0; i < a.length; i++) { sum += a[i]; } - for-each:
for (int x : a) { sum += x; } - كلاهما يعطي نفس المجموع؛ for-each أنظف عندما لا يكون الفهرس ضرورياً.
المرور يزرع كل عنصر. الحلقة المؤشرة (for (int i = 0; i < a.length; i++)) تعطي الموقع i ويمكنها تعديل a[i]؛ أما حلقة for-each (for (int x : a)) فتقوم بـ القراءة بشكل نظيف لكل قيمة لكنها لا تستطيع تغيير المصفوفة أو استخدام فهرس. اختر بناءً على حاجتك للفهرس أو التعديل.
مرور المصفوفة لحساب مجموعها
i يزور كل فهرس؛ sum يجمع a[i] (هنا a = {10,20,30}).
الشرط الصحيح لمرور مصفوفة a بفهرس هو...
الفهارس الصالحة هي 0..length-1، لذا i < a.length.
أي حلقة يجب أن تستخدم إذا كنت بحاجة إلى تعديل عناصر المصفوفة؟
لا يمكن لـ for-each إعادة assignment؛ استخدم a[i] = ... مع الحلقة ذات الفهرس.
في for (int x : a) { x = 0; }، يتم تعيين المصفوفة a بالكامل إلى أصفار.
x هو نسخة محلية؛ المصفوفة تبقى دون تغيير.
حلقة for-each for (int x : a) هي الأفضل عندما تحتاج فقط إلى...
يقوم for-each بقراءة القيم بشكل نظيف بدون الحاجة لفهرس.
زيارة كل عنصر في مصفوفة تسمى ___ (كلمة واحدة).
المرور (traversal) يزرع كل عنصر.