تخطَّ إلى المحتوى

المصفوفات في Java: Array و ArrayList

الدرس 6 من 11 · Java

إذا أردت تخزين درجات 40 طالباً، فلن تنشئ 40 متغيراً منفصلاً! المصفوفة (Array) تجمع قيماً كثيرة من نفس النوع تحت اسم واحد. في هذا الدرس ستتعلم المصفوفات في Java، ثم ستتعرف على ArrayList: القائمة المرنة التي يستخدمها المبرمجون أكثر في التطبيقات الحقيقية.

int[] scores = {85, 92, 78, 64};
System.out.println(scores[0]);
System.out.println(scores.length);
scores[1] = 95;
الناتج
85
4
  • int[]: نوع المصفوفة: «مصفوفة أعداد صحيحة».
  • {...}: القيم الأولية.
  • scores[0]: أول عنصر، فالترقيم يبدأ من صفر.
  • length: عدد العناصر، وهي خاصية بدون أقواس.
  • scores[1] = 95: تعديل العنصر الثاني.

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

System.out.println(Arrays.toString(scores));
System.out.println(scores);
الناتج
[85, 95, 78, 64]
[I@6572421

طباعة المصفوفة مباشرة تعطيك شيئاً غريباً مثل [I@6572421، وهو نوعها وعنوانها في الذاكرة! استخدم Arrays.toString لطباعة عناصرها، ولا تنسَ السطر import java.util.Arrays; في أول الملف.

String[] names = new String[3];
names[0] = "سارة";
System.out.println(Arrays.toString(names));
int[] counts = new int[4];
System.out.println(Arrays.toString(counts));
الناتج
[سارة, null, null]
[0, 0, 0, 0]

عند الإنشاء بـ new وحجم، تأخذ العناصر قيماً افتراضية: صفر للأرقام، و false لـ boolean، و null للنصوص والكائنات.

لحساب المجموع والمتوسط وأكبر قيمة:

int sum = 0;
int max = scores[0];
for (int s : scores) {
sum += s;
if (s > max) max = s;
}
System.out.println("المجموع: " + sum);
System.out.println("المتوسط: " + (double) sum / scores.length);
System.out.println("الأكبر: " + max);
الناتج
المجموع: 322
المتوسط: 80.5
الأكبر: 95

لاحظ (double) sum: بدونها ستكون القسمة بين عددين صحيحين، فيضيع الكسر وتصبح النتيجة 80 بدلاً من 80.5.

Arrays.sort(scores);
System.out.println(Arrays.toString(scores));
الناتج
[64, 78, 85, 95]

Arrays.sort ترتب المصفوفة نفسها تصاعدياً.

المصفوفات ثنائية الأبعاد

Section titled “المصفوفات ثنائية الأبعاد”

مصفوفة كل عنصر فيها مصفوفة، مثل جدول فيه صفوف وأعمدة:

int[][] grid = {
{1, 2, 3},
{4, 5, 6}
};
System.out.println(grid[1][2]);
for (int[] row : grid) {
System.out.println(Arrays.toString(row));
}
الناتج
6
[1, 2, 3]
[4, 5, 6]

grid[1][2]: الرقم الأول للصف، والثاني للعمود. أي الصف الثاني والعمود الثالث. تُستخدم في الجداول ولوحات الألعاب مثل XO والشطرنج.

في التطبيقات الحقيقية، غالباً لا تعرف عدد العناصر مسبقاً. هنا تأتي ArrayList:

import java.util.ArrayList;
ArrayList<String> tasks = new ArrayList<>();
tasks.add("مذاكرة");
tasks.add("رياضة");
tasks.add("قراءة");
tasks.remove("رياضة");
tasks.set(0, "مذاكرة Java");
System.out.println(tasks);
System.out.println(tasks.size());
System.out.println(tasks.get(1));
System.out.println(tasks.contains("قراءة"));
الناتج
[مذاكرة Java, قراءة]
2
قراءة
true
المصفوفة ArrayList
حجم ثابت تكبر وتصغر تلقائياً
arr[0] list.get(0)
arr.length list.size()
arr[0] = x list.set(0, x)
تحتاج Arrays.toString للطباعة تُطبع مباشرة

<String> تحدد نوع العناصر. ولاحظ أن ArrayList لا تقبل الأنواع البدائية مباشرة، فبدلاً من int تكتب Integer: ArrayList<Integer>.

  1. أنشئ مصفوفة بدرجات 5 طلاب، واطبع المتوسط وأقل درجة.
  2. رتبها واطبعها بـ Arrays.toString.
  3. أنشئ ArrayList لقائمة مشتريات، أضف 4 عناصر، واحذف واحداً، واطبع العدد.
  4. تحدٍّ: أنشئ مصفوفة ثنائية الأبعاد 3×3 للعبة XO، وضع فيها 'X' و 'O'، واطبعها صفاً صفاً.
  • رقم خارج الحدود: scores[10] في مصفوفة من 4 عناصر تعطي خطأ Index 10 out of bounds for length 4. آخر رقم هو length - 1.
  • طباعة المصفوفة مباشرة: تطبع عنوانها. استخدم Arrays.toString.
  • الخلط بين length و size: length للمصفوفة (بدون أقواس)، و size() لـ ArrayList.

سؤال

في المصفوفة int[] a = {4, 7, 9}; ما قيمة a[a.length - 1]؟

سؤال

أي اختيار هو الأنسب لقائمة مهام يضيف إليها المستخدم ويحذف منها باستمرار؟

  • int[] a = {...} تنشئ مصفوفة، والترقيم يبدأ من صفر، و length عدد العناصر.
  • حجم المصفوفة ثابت، و new int[4] تنشئها بقيم افتراضية.
  • Arrays.toString للطباعة، و Arrays.sort للترتيب، و for-each للمرور عليها.
  • int[][] مصفوفة ثنائية الأبعاد للجداول.
  • ArrayList قائمة مرنة: add و remove و get و set و size.