المصفوفات Arrays
لماذا نحتاج Array؟ وكيف ننشئها؟ وكيف نصل للعناصر؟ وكيف نستخدم length والحلقات للمرور عليها بكفاءة؟
ما هي المصفوفة ولماذا نحتاجها؟
تخيّل أنك تريد تخزين درجات 5 طلاب — بدون المصفوفة ستكتب:
int s1 = 90; int s2 = 85; int s3 = 70; int s4 = 100; int s5 = 95; // وماذا لو كانوا 100 طالب؟!
الحل: المصفوفة (Array) — متغير واحد يخزن داخله مجموعة قيم من نفس النوع، ويمكن الوصول لكل قيمة برقمها (الفهرس).
int[]
أعداد صحيحة
String[]
نصوص
double[]
أعداد عشرية
boolean[]
قيم منطقية
إنشاء Array — الطرق المختلفة
يوجد طريقتان رئيسيتان لإنشاء Array في Java:
الطريقة ① تعريف بالقيم مباشرة
int[] scores = {90, 85, 70, 100, 95}; String[] names = {"Ali", "Sara", "Ahmed"}; double[] prices = {9.99, 14.5, 3.75};
القيم معروفة مسبقاً — تُكتب مباشرة بين الأقواس المعقوفة مفصولة بفواصل.
الطريقة ② تحديد الحجم ثم التعبئة لاحقاً
// نحدد حجم المصفوفة فقط int[] scores = new int[5]; // ثم نملأها لاحقاً scores[0] = 90; scores[1] = 85; scores[2] = 70; scores[3] = 100; scores[4] = 95;
مفيدة عندما لا تعرف القيم مسبقاً — تنشئ المصفوفة فارغة ثم تملؤها.
عند إنشاء int[] بالحجم فقط، تُملأ تلقائياً بـ 0 وللـ String بـ null.
الفهارس (Indexes) — أهم مفهوم في المصفوفات
تنبيه مهم جداً
المصفوفات تبدأ من الفهرس صفر (0) وليس 1 — هذا يسبب أخطاء كثيرة للمبتدئين!
إذا كانت المصفوفة:
int[] scores = {90, 85, 70, 100};
scores[0]
scores[1]
scores[2]
scores[3]
scores[4]
خطأ!
int[] scores = {90, 85, 70, 100}; System.out.println(scores[0]); ← 90 (العنصر الأول) System.out.println(scores[1]); ← 85 System.out.println(scores[3]); ← 100 (العنصر الأخير) // يمكن تعديل قيمة عنصر موجود scores[2] = 75; ← غيّرنا 70 إلى 75
📊 قاعدة الفهارس
| الترتيب | الأول | الثاني | الثالث | الأخير (n عناصر) |
|---|---|---|---|---|
| الفهرس | [0] | [1] | [2] | [n-1] |
مصفوفة بـ 4 عناصر: الفهارس من [0] إلى [3] فقط — [4] خارج الحدود!
خاصية length — طول المصفوفة
كل مصفوفة لها خاصية مدمجة تُسمى length تُعطيك عدد عناصرها.
int[] scores = {90, 85, 70, 100}; String[] names = {"Ali", "Sara", "Ahmed"}; System.out.println(scores.length); ← 4 System.out.println(names.length); ← 3 // آخر عنصر دائماً عند الفهرس (length - 1) System.out.println(scores[scores.length - 1]); ← 100
4 3 100
قاعدة ذهبية: آخر فهرس صالح = length - 1 دائماً. مصفوفة بـ 4 عناصر → آخر فهرس = [3].
المرور على المصفوفة بالحلقات
قوة المصفوفات تظهر عند دمجها مع الحلقات — تستطيع معالجة آلاف العناصر بكود بسيط.
for عادية عندما تحتاج الفهرس
int[] scores = {90, 85, 70, 100}; for (int i = 0; i < scores.length; i++) { System.out.println("الطالب " + (i+1) + ": " + scores[i]); }
الطالب 1: 90 الطالب 2: 85 الطالب 3: 70 الطالب 4: 100
i < scores.length وليس <= — بهذا لا نتجاوز الحد!
for-each أسهل قراءة — عندما لا تحتاج الفهرس
int[] scores = {90, 85, 70, 100}; for (int s : scores) { System.out.println(s); }
90 85 70 100
تقرأ: "لكل عنصر s في مصفوفة scores — اطبعه"
🧮 مثال عملي — إيجاد المجموع والمعدل
int[] scores = {90, 85, 70, 100, 95}; int sum = 0; for (int s : scores) { sum += s; } double avg = (double) sum / scores.length; System.out.println("المجموع: " + sum); System.out.println("المعدل: " + avg);
المجموع: 440 المعدل: 88.0
مصفوفة النصوص — String Array
المصفوفات لا تقتصر على الأرقام — يمكن استخدامها لتخزين النصوص والأسماء:
String[] students = {"Ali", "Sara", "Ahmed", "Nora"}; // طباعة الأسماء مع أرقامها for (int i = 0; i < students.length; i++) { System.out.println((i+1) + ". " + students[i]); }
1. Ali 2. Sara 3. Ahmed 4. Nora
أخطاء شائعة جداً في Arrays ⚠️
البدء من فهرس 1 بدل 0
❌ خطأ — يبدأ من 1
for (int i = 1; i < scores.length; i++)
سيتجاهل العنصر الأول!
✅ صحيح
for (int i = 0; i < scores.length; i++)
استخدام <= بدل < — ArrayIndexOutOfBoundsException
❌ خطأ — تجاوز الحدود
i <= scores.length
مصفوفة 4 عناصر → [4] غير موجود!
✅ صحيح
i < scores.length
يتوقف عند [3] — آخر عنصر
وضع نوع بيانات مختلف في المصفوفة
❌ خطأ تجميع
int[] scores = {90, "Ali", 85};
نص داخل مصفوفة int!
✅ صحيح
int[] scores = {90, 85, 70};
String[] names = {"Ali"};
طباعة المصفوفة مباشرةً بدون حلقة
❌ يطبع عنوان الذاكرة وليس القيم
System.out.println(scores);
// الناتج: [I@1b6d3586
استخدم حلقة أو Arrays.toString(scores)
📋 ملخص الدرس
Array = متغير يخزن مجموعة قيم من نفس النوع
الفهارس تبدأ من [0] — آخر فهرس = [length-1]
.length تعطيك عدد العناصر
استخدم i < length في الحلقة — وليس <=
⏭️ في الدرس القادم:
سنتعلم النصوص (String) — كيف نتعامل معها بطريقة صحيحة في Java وما هي أهم الدوال المدمجة للتعامل مع النصوص.