المصفوفات Arrays

20:00 دقائق مجاني

لماذا نحتاج 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};

90
scores[0]
85
scores[1]
70
scores[2]
100
scores[3]
💥
scores[4]

خطأ!

Arrays.java
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

المصفوفات لا تقتصر على الأرقام — يمكن استخدامها لتخزين النصوص والأسماء:

StringArray.java
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 وما هي أهم الدوال المدمجة للتعامل مع النصوص.

الدرس التالي العودة للسابق