القوائم في جافا
القوائم ( lists ) في لغة جافا هي عبارة عن أداة لتخزين البيانات مثل المصفوفة تماماً, نحن نستخدم المصفوفة لتخزين البيانات و كذلك القائمة List يستخدم لتخزين البيانات.
الفرق بين القوائم و المصفوفات
القائمة List اكثر فاعلية و ديناميكية و اكثر كفاءة لأن عن طريقها نستطيع البحث داخل البيانات بكل سهولة "بحث, إضافة, حفظ" و إسترجاع و قراءة البيانات بكل سهولة. للقوائم List نوعان سوف نشرحهما بكل تفصيل وهما (ArrayList, LinkedList).
القائمة ArrayList في جافا
القائمة ArrayList و Array تعني مصفوفة وهي سوف توفّر علينا تعريفها و تعيين حجمها يعني عندما. نعرف مصفوفة نوع ArrayList لا نحتاج لتعريف حجمها لأن الحجم سيكبر تلقائياً مع إضافة العناصر, و يقوم بتخزين البيانات في الذاكرة بشكل منتظم.
الشكل العام للقائمة ArrayList
List<String> s=new ArrayList<String>();
لبناء الليست نكتب الكلمة المحجوزة List ثم نتبعها بنوع البيانات التي سيتم تخزينها في الليست مثلاً. String ثم نقوم بكتابة كائن object على سبيل المثال n ثم = new ثم إسم اللستة ثم نوع البيانات مرة أخرى.
package forech; import java.util.ArrayList; import java.util.List; public class Forech { public static void main(String[] args) { List<String> s=new ArrayList<String>(); s.add("badria"); s.add("muhammad"); s.add("amer"); System.out.println(s); } }
في البداية قُمنا بتضمين حزمة الإدخال للمصفوفة ArrayList و ايضاً حزمة الإدخال لليست List. بعد ذلك دخلنا للبرنامج الرئيسي و أنشأنا ليست نوعها نصي String و كائن الإدخال هو s و كتبنا إسم لليست و أضفنا لها ثلاث عناصر عبر الدالة add. و العناصر هي "badria, muhammad, amer" ثم طلبنا من البرنامج عرض البيانات كاملة على الشاشة عبر دالة الطباعة println.
القائمة LinkedList في Java
هذا النوع يقوم بتخزين البيانات في الذاكرة بشكل عشوائي على شكل عقد و كل عقدة لها عنوان. مما يسهّل علينا البحث و التعديل و الإضافة, و هو النوع الشائع و المستخدم أكثر.
package forech; import java.util.LinkedList; import java.util.List; public class Forech { public static void main(String[] args) { List<String> s=new LinkedList<String>(); s.add("badria"); s.add("muhammad"); s.add("amer"); System.out.println(s); } }
في البداية قمنا بتضمين حزمة الإدخال للمصفوفة LinkedList و ايضاً حزمة الإدخال لليست List. بعد ذلك دخلنا للبرنامج الرئيسي و أنشأنا ليست نوعه نصي ثم قمنا بإضافة لها ثلاث عناصر و هي "muhammad, amer, badria " قم قمنا بطباعة المصفوفة بشكل كامل على الشاشة.
إضافة قيم عددية متنوعة في List من نوع LinkedList
في هذه الفقرة سوف نتعرف على كيفية تعريف ليست من نوع Number و Number هو شامل Integer و Double و Float و كل ما يتعلق بالاعداد.
الشكل العام لإضافة قيم عددية في قائمة LinkedList
List<Number> s=new LinkedList<Number>();
لإضافة قيمة عددية من نوع Float او Long او Double إلى الليست نستخدم الكائن.
package forech; import java.util.LinkedList; import java.util.List; public class Forech { public static void main(String[] args) { List<Number> s=new LinkedList<Number>(); s.add(new Integer(4)); s.add(new Float(9.4)); s.add(new Double(236.269)); s.add(new Long(82687985)); System.out.println(s); } }
دخلنا للبرنامج الرئيسي وقُمنا بإنشاء ليست نوعها أرقام Number و إسمها LinkedLists ثم قمنا عن. طريق الكائن s بإضافة اربع عناصر رقمية من انواع مختلفة (Int, Float, Double, Long) ثم قمنا بطباعة جميع عناصر الكائن على الشاشة.
إستخدام foreach مع القوائم في جافا
إذا اردنا أن نطبع كل كل عقدة على حدى يجب أن نستخدم خاصية forEach و في لغة الجافا تكتب for عادية.
package forech; import java.util.LinkedList; import java.util.List; public class Forech { public static void main(String[] args) { List<Number> s=new LinkedList<Number>(); s.add(new Integer(4)); s.add(new Float(9.4)); s.add(new Double(236.269)); s.add(new Long(82687985)); s.set(2, new Double(561.235)); for(Number i:s) System.out.println(i); } }
دخلنا للبرنامج الرئيسي وقُمنا بإنشاء ليست نوعها أرقام Number و إسمها LinkedLists ثم قمنا بإضافة. أرقام من أنواع بيانات مختلفة عبر الكائن s ثم دخلنا في حلقة foreEach و قلنا. له i:s يعني خزن لنا كافة قيم s في i ثم طباعة i كل عقدة. على حدى و i سيبقى يشير إلى قيم s قيمة قيمة و سيطبع النتائج على الشاشة كل قيمة في سطر لوحدها.
إضافة قيمة جديدة في List وتحديد موقعها
في هذه الفقرة سوف نتعلم على كيفية إضافة قيمة إلى الليست و كذلك تحديد موقعها في الليست و كيفية إسترجاع قيمة من الليست. يجب أن نعرف بأن العقدة الأولى عنوانها 0 و العقدة الثانية 1 و الثالثة 2 ...الخ, نستخدم الدالة add للإضافة.
1-إضافة قيمة جديدة بموقع معين في الليست
package forech; import java.util.LinkedList; import java.util.List; public class Forech { public static void main(String[] args) { List<Number> s=new LinkedList<Number>(); s.add(new Integer(3)); s.add(new Float(5.4)); s.add(new Double(2036.269)); s.add(new Long(155562)); s.add(2,new Integer(10)); System.out.println(s); } }
قمنا بإنشاء ليست من نوع أرقام وقمنا بإضافة لها اربع قيم عددية لأنواع مختلفة ثم قمنا بشكل إجباري. بإضافة قيمة عددية بالعقدة رقم 2 نوعها Integer و قيمتها. 10 و عند التشغيل سيقوم البرنامج بإضافتها مكان العقدة 2 و إزاحة الباقي للأمام.
2-طباعة قيمة واحدة من الليست
package forech; import java.util.LinkedList; import java.util.List; public class Forech { public static void main(String[] args) { List<Number> s=new LinkedList<Number>(); s.add(new Integer(3)); s.add(new Float(5.4)); s.add(new Double(2036.269)); s.add(new Long(155562)); s.add(2,new Integer(10)); Number N=s.get(1); System.out.println(N); } }
قمنا بإنشاء ليست من نوع ارقام وقمنا بإضافة لها اربع قيم عددية لأنواع مختلفة ثم قمنا بشكل إجباري بإضافة. قيمة عددية بالعقدة رقم 2 نوعها Integer و قيمتها 10 و عند التشغيل سيقوم البرنامج بإضافتها مكان. العقدة 2 و إزاحة الباقي للأمام ثم انشأنا متغير بنفس نوع البيانات N و حددنا له بأن يطبع لنا فقط العقدة رقم 1 عن طريق الكائن و الدالة get و وضعنا أمر الطباعة بأن يطبع لنا N.
تعديل او حذف عقدة في الليست
في حال أردنا التعديل على قيمة ما في الليست أو حذف عقدة ما, يمكن أن نستخدم الكائن الخاص. بالليست ثم الدالة set وفي حال التعديل يطلب مننا تمركز العقدة و القيمة الجديدة, و لحذف قيمة من عقدة نستخدم الدالة remove.
تعديل عقدة set في جافا
package forech; import java.util.LinkedList; import java.util.List; public class Forech { public static void main(String[] args) { List<Number> s=new LinkedList<Number>(); s.add(new Integer(3)); s.add(new Float(5.4)); s.add(new Double(2036.269)); s.add(new Long(155562)); s.set(2, new Double(2665.62)); System.out.println(s); } }
في هذا المثال قمنا بتعديل العقدة رقم 2 و أضفنا لها قيمة جديدة و هي 2665.62 هذا الرقم سوف يحل مكان العقدة رقم 2 عند الطباعة.
حذف عقدة remove في Java
package forech; import java.util.LinkedList; import java.util.List; public class Forech { public static void main(String[] args) { List<Number> s=new LinkedList<Number>(); s.add(new Integer(3)); s.add(new Float(5.4)); s.add(new Double(2036.269)); s.add(new Long(155562)); s.set(2, new Double(2665.62)); s.remove(1); System.out.println(s); } }
في هذا المثال إستخدمنا الدالة remove للحذف و عن طريق الكائن s إستخدمنا الدالة remove من. اجل حذف قيم العقدة رقم 1و عند التشغيل سيقوم بحذف العقدة رقم 1 و يطبع باقي العقد.
البحث عن قيمة داخل الليست
في بعض الأحيان نُريد البحث عن قيمة أو إسم بداخل اللست للوصول المباشر لها في حال كانت بيانات ضخمة, يتم هذا عن طريق الدالة contains.
package forech; import java.util.LinkedList; import java.util.List; public class Forech { public static void main(String[] args) { List<String> s=new LinkedList<String>(); s.add("Parrot"); s.add("AMVIIP"); s.add("Bashar"); s.add("S49"); if(s.contains("Bashar")) System.out.println("موجود"); else System.out.println("غير موجود"); } }
في هذا المثال قمنا بالدخول في حلقة if عبر الدالة contains و قلنا له في حال كان الإسم Bashar موجود في الليست إطبع لنا أنه موجود, و في حال لم تجده إطبع لنا بأنه غير موجود.
ترتيب قائمة اسماء في الليست
لترتيب أسماء داخل قوائم الليست مثلاً حسب الأبجدية نقوم بعمل هذا بسهولة عبر Collections.sort للترتيب الأبجدي و للترتيب العكسي نستخدم Collections.reverce.
1-ترتيب ابجدي Collections.sort
package forech; import java.util.LinkedList; import java.util.List; public class Forech { public static void main(String[] args) { List<String> s=new LinkedList<String>(); s.add("Parrot"); s.add("AMVIIP"); s.add("Bashar"); s.add("S49"); Collections.sort(s); System.out.println(s); } }
لقد أنشأنا مصفوفة نصية تحتوي على أربع عناصر و عن طريق إستخدام الدالة Collections.sort و حددنا الكائن له من أجل ترتيب هذه العناصر بترتيب أبجدي عند تشغيل البرنامج.
2-ترتيب عكسي Collections.reverce
package forech; import java.util.LinkedList; import java.util.List; public class Forech { public static void main(String[] args) { List<String> s=new LinkedList<String>(); s.add("Parrot"); s.add("AMVIIP"); s.add("Bashar"); s.add("S49"); Collections.sort(s); System.out.println(s); Collections.reverce(s); System.out.println(s); } }
لقد أنشأنا مصفوفة نصية تحتوي على أربع عناصر و عن طريق إستخدام الدالة Collections.reverce و حددنا الكائن له سوف يقوم بترتيب عناصر الليست بشكل عكسي بعكس المثال السابق.
نسخ قائمة من قائمة اخرى
لنتعلم هنا كيفية نسخ ليستة الى ليستة اخرى و سنستخدم في هذا الدالة Collections.copy.
package forech; import java.util.LinkedList; import java.util.List; public class Forech { public static void main(String[] args) { List<String> C=new LinkedList<String>(); C.add("Parrot"); C.add("AMVIIP"); C.add("Bashar"); C.add("S49"); List<String> S=new LinkedList<String>(); S.add("Parrot"); S.add("AMVIIP"); S.add("Bashar"); S.add("S49"); Collections.copy(S, C) /copy C in S System.out.println(S); /print S } }
لقد قمنا هنا بإنشاء قائمتين الأولى الكائن الخاص بها C و الثانية الكائن الخاص بها هو S و بكل واحدة بيانات مختلفة عن الأخرى. ثم إستخدمنا الدالة Collections.copy من أجل نسخ عناصر المصفوفة التي كائنها C في المصفوفة. التي كائنها S وعند التشغيل سوف يتم محو محتويات C ووضعها في S ثم. قمنا بطباعة محتويات S لنجد بها محتويات الكائن C.