الموضوع 14
القوائم الديناميكية ArrayList
قائمة ذكية يكبر حجمها ويصغر حسب الحاجة، بدل المصفوفة ذات الحجم الثابت.
بعد هذا الدرس ستستطيع أن:
- توضّح الفرق بين المصفوفة ذات الحجم الثابت والقائمة ArrayList.
- تُنشئ قائمة ArrayList لنوع معيّن من البيانات أو الكائنات.
- تستخدم الدوال add و get و set و remove و size و contains.
- تمرّ على عناصر القائمة بحلقة for أو for-each لمعالجتها.
١مشكلة المصفوفة
المصفوفة نحدد حجمها عند إنشائها، ولا يمكن تغييره بعد ذلك:
int[] marks = new int[3];marks[0] = 80;marks[1] = 50;marks[2] = 92;marks[3] = 70; // خطأ! المصفوفة حجمها 3 فقط
ماذا لو انضم طالب جديد إلى الشعبة؟ هنا يأتي دور ArrayList: قائمة من الحزمة java.util يزيد حجمها وينقص تلقائيًّا.
Ali[0]Sara[1]Omar[2]Huda[3]
٢إنشاء القائمة
import java.util.ArrayList; ArrayList<String> names = new ArrayList<>();
- بين القوسين < > نكتب نوع العناصر: String للنصوص، و Student للكائنات.
- للأرقام نكتب الأنواع الكاملة:
Integerبدل int، وDoubleبدل double.
٣أهم الدوال
| الدالة | وظيفتها | مثال |
|---|---|---|
add(x) | تضيف عنصرًا في آخر القائمة | names.add("Ali"); |
get(i) | تقرأ العنصر في الموقع i | names.get(0) |
set(i, x) | تغيّر العنصر في الموقع i | names.set(1, "Huda"); |
remove(i) أو remove(x) | تحذف عنصرًا بموقعه أو بقيمته | names.remove("Omar"); |
size() | عدد العناصر | names.size() |
contains(x) | هل العنصر موجود؟ true أو false | names.contains("Ali") |
isEmpty() | هل القائمة فارغة؟ | names.isEmpty() |
clear() | تحذف كل العناصر | names.clear(); |
import java.util.ArrayList; public class Main { public static void main(String[] args) { ArrayList<String> names = new ArrayList<>(); names.add("Ali"); // إضافة names.add("Sara"); names.add("Omar"); System.out.println(names); System.out.println("Size: " + names.size()); System.out.println("First: " + names.get(0)); // قراءة names.set(1, "Huda"); // تعديل names.remove("Omar"); // حذف System.out.println(names); System.out.println(names.contains("Ali")); // بحث }}
run:
[Ali, Sara, Omar]
Size: 3
First: Ali
[Ali, Huda]
true
BUILD SUCCESSFUL (total time: 0 seconds)
٤المرور على عناصر القائمة
بحلقة for-each، أو بحلقة for العادية مع size() و get(i):
import java.util.ArrayList; public class Main { public static void main(String[] args) { ArrayList<Double> marks = new ArrayList<>(); marks.add(80.0); marks.add(50.0); marks.add(92.0); double sum = 0; for (double m : marks) { sum = sum + m; } System.out.println("Average: " + sum / marks.size()); for (int i = 0; i < marks.size(); i++) { System.out.println(i + ": " + marks.get(i)); } }}
run:
Average: 74.0
0: 80.0
1: 50.0
2: 92.0
BUILD SUCCESSFUL (total time: 0 seconds)
٥قائمة من الكائنات
الأهم في البرمجة الشيئية: قائمة من كائنات كلاس كتبته أنت، مثل كلاس Student من التدريب 6:
public class Student { int id; String name; double mark; public Student(int id, String name, double mark) { this.id = id; this.name = name; this.mark = mark; } String getResult() { if (mark >= 60) return "Pass"; else return "Fail"; }}
ملفات المشروع في تبويبات كما في NetBeans. زر التشغيل يجمعها في ملف واحد ليعمل على OneCompiler.
run:
عدد الطلاب: 3
4321 - Mohammed - Pass
4344 - Turki - Fail
4355 - Fahad - Pass
BUILD SUCCESSFUL (total time: 0 seconds)
٦المصفوفة أم ArrayList؟
| المصفوفة Array | ArrayList | |
|---|---|---|
| الحجم | ثابت | يتغيّر تلقائيًّا |
| الإنشاء | int[] a = new int[3]; | ArrayList<Integer> a = new ArrayList<>(); |
| عدد العناصر | a.length | a.size() |
| القراءة | a[0] | a.get(0) |
| الإضافة والحذف | غير ممكن | add و remove |
توقّع وتحقّق
أجب قبل أن تنظر إلى الشرح. التصحيح فوري، وإجاباتك تُحفظ.
لإضافة الاسم Ali إلى القائمة names نكتب:
تأمل الكود التالي،
ArrayList<String> list = new ArrayList<>();list.add("A");list.add("B");list.add("C");list.remove("B");list.add("D");System.out.println(list.size());
ماذا سيكون الناتج عند تنفيذه؟
أضفنا ثلاثة عناصر ثم حذفنا واحدًا ثم أضفنا واحدًا: 3.
أي سطر صحيح لإنشاء قائمة أعداد صحيحة؟
الأنواع البسيطة مثل int تُكتب بأسمائها الكاملة: Integer.
الحزمة التي يوجد فيها ArrayList:
الخلاصة
- ArrayList قائمة يتغيّر حجمها، من الحزمة java.util.
- نكتب نوع العناصر بين < >، و Integer و Double بدل int و double.
- add للإضافة، get للقراءة، set للتعديل، remove للحذف، size للعدد.
- يمكن أن تحتوي القائمة كائنات من كلاس كتبته، مثل ArrayList
.