قائمة ArrayList المخصصة في Java

قائمة ArrayList المخصصة في Java

قبل المضي قدمًا، دعونا نراجع بسرعة مفهوم صفائف و ArrayList بسرعة. لذلك رأينا في جافا أن المصفوفات عبارة عن هياكل بيانات خطية توفر وظائف لإضافة عناصر بطريقة مستمرة في مساحة عنوان الذاكرة بينما ArrayList عبارة عن فئة تنتمي إلى إطار عمل المجموعة. كونه مبرمجًا جيدًا، فهو يدرك بالفعل استخدام ArrayList على المصفوفات على الرغم من معرفة الاختلافات بين هذين الاثنين. الآن نمضي قدمًا حتى مع ArrayList، حيث تأتي وظيفة لتمرير نوع بيانات العناصر التي من المفترض أن يتم تخزينها في ArrayList سواء كانت عبارة عن عدد صحيح لسلسلة كائنات ذات تعويم مزدوج وما إلى ذلك. 

بناء الجملة:

 Arraylist  al = new ArrayList  ;  

ملحوظة: ArrayList في Java (أي ما يعادل المتجه في C++) ذات حجم ديناميكي. يمكن تقليصها أو توسيعها على أساس الحجم. يعد ArrayList جزءًا من إطار عمل المجموعة وهو موجود في حزمة java.util

بناء الجملة:

 ArrayList   list = new ArrayList  <> ();  

الشيء المهم هنا هو أن E هنا يمثل نوع بيانات كائن تخيله عدد صحيح هنا. تغلف فئة Integer قيمة من النوع البدائي كثافة العمليات في كائن. يحتوي كائن من النوع Integer على حقل واحد نوعه int. هل تذهب من خلال مفهوم فئات المجمع في Java قبل المضي قدمًا لأنه سيخدم هنا في الواجهة الخلفية مما يجعل الفهم أكثر وضوحًا إذا كنا ندرك ذلك جيدًا مفاهيم autoboxing وunboxing . وذلك لأنه أثناء إجراء العمليات على العناصر في القائمة، سيختلف بناء الجملة الخاص بها، لذا فإن استيعاب المفهوم سوف يستنفد كما لو افترضنا النظر في سيناريو إضافة عناصر إلى ArrayList المخصصة وملاحظة الاختلافات في بناء الجملة بين اثنين منهم. 

بناء الجملة:

 ArrayList        al     = new Arraylist  () ;   
al.add(1) ;

بناء الجملة:

 ArrayList      alobj     = new Arraylist() ;   
alobj(new Integer(1)) ;

دعونا نأخذ مثالاً توضيحيًا لندركه كما هو موضح أدناه على النحو التالي:

توضيح:

قائمة ArrayList المخصصة في Java

لدينا هنا جميع العناصر من نفس النوع والتي غالبًا ما نستخدمها بشكل عام. الآن دعونا نقترح نفس التدفق التخطيطي ArrayList يدعم ببساطة بيانات متعددة بالطريقة الموضحة في هذه الصورة. 

قائمة ArrayList المخصصة في Java


في ArrayList أعلاه يمكننا أن نرى بوضوح أن العناصر المخزنة فيها هي من أنواع مختلفة. لذلك لا تندلع مفهوم تقييد. إلى نوع واحد وليس هذه القائمة فقط، فهي تمنحنا المرونة اللازمة لإنشاء القائمة وفقًا لنوعنا حيث يمكننا الوصول إلى نوع البيانات التي يمكن أن تكون موجودة في ArrayList الخاصة بنا. يشار إلى هذه القائمة باسم Custom ArrayList في Java . تحتوي قائمة ArrayList المخصصة على سمات تعتمد على متطلبات المستخدم ويمكن أن تحتوي على أكثر من نوع واحد من البيانات. يتم توفير هذه البيانات من خلال فئة داخلية مخصصة يتم تشكيلها من خلال مجموعة من أنواع بيانات الكائنات البدائية المختلفة.

تطبيق: النظر في الحالة عندما يتعين علينا أن نأخذ المدخلات كما ن عدد الطلاب والتفاصيل هي: 

  • رقم لفة
  • اسم
  • علامات
  • رقم التليفون

لنفترض أننا إذا لم نكن على دراية بمفهوم قائمة المصفوفات المخصصة في جافا، فسنقوم بإنشاء قوائم ArrayLists الفردية المدرجة أدناه. حيث أننا نحدد 4 قوائم ArrayLists ونحفظ البيانات وفقًا لذلك في كل منها.

 ArrayList   roll = new ArrayList <>(); // roll number  
  ArrayList  name = new ArrayList <>(); // name  
 ArrayList   marks = new ArrayList <>(); // marks  
 ArrayList  phone = new ArrayList <>(); // phone number   

سنقوم الآن بتكرار كل منها لجلب بيانات الطلاب مما يزيد من التعقيد الزمني لبرنامجنا إلى حد أكبر كما هو موضح أدناه على النحو التالي.

 for (int i = 0; i  < n; i++)    
{

// Adding all the values to each arraylist
// each arraylist has primitive datatypes

roll.add(rollnum_i);
name.add(name_i);
marks.add(marks_i);
phone.add(phone_i);
}

الآن دعونا نفعل الشيء نفسه بمساعدة المفهوم الذي تعلمناه أعلاه من خلال تنفيذ نفس الشيء. لذلك، من أجل إنشاء قائمة ArrayList المخصصة لدينا، قم بتنفيذ الخطوات المذكورة أدناه على النحو التالي:

إجراء: إنشاء ArrayList مخصص كما يلي:

  1. قم ببناء كائن ArrayList ووضع نوعه كبيانات فئة.
  2. تحديد فئة ووضع الكيانات المطلوبة في المنشئ.
  3. ربط تلك الكيانات بالمتغيرات العالمية.
  4. البيانات الواردة من ArrayList هي من نوع الفئة الذي يخزن بيانات متعددة.

مثال

Java
   // Java program to illustrate Custom ArrayList   // Importing ArrayList class from java.util package   import     java.util.ArrayList  ;   // Class 1   // Outer class   // Main class   // CustomArrayList   class   Data     {      // Global variables of the class      int     roll  ;      String     name  ;      int     marks  ;      long     phone  ;      // Constructor has type of data that is required      Data  (  int     roll       String     name       int     marks       long     phone  )      {      // Initialize the input variable from main      // function to the global variable of the class      // this keyword refers to current instance      this  .  roll     =     roll  ;      this  .  name     =     name  ;      this  .  marks     =     marks  ;      this  .  phone     =     phone  ;      }   }   public     class   GFG     {      // Custom class which has data type class has      // defined the type of data ArrayList      // size of input 4      int     n     =     4  ;      // Class 2      // Inner class      // The custom datatype class      public     void     addValues  (  int     roll  []       String     name  []        int     marks  []       long     phone  []  )      {      // local custom arraylist of data type      // Data having (int String int long) type      // from the class      ArrayList   <  Data  >     list     =     new     ArrayList   <>  ();      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )     {      // create an object and send values to the      // constructor to be saved in the Data class      list  .  add  (  new     Data  (  roll  [  i  ]       name  [  i  ]       marks  [  i  ]        phone  [  i  ]  ));      }      // after adding values printing the values to      // test the custom arraylist      printValues  (  list  );      }      // Method 2      // To print the values      public     void     printValues  (  ArrayList   <  Data  >     list  )      {      // list- the custom arraylist is sent from      // previous function      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )     {      // Data received from arraylist is of Data      // type which is custom (int String int      // long) based on class Data      Data     data     =     list  .  get  (  i  );      // Print and display custom ArrayList      // elements that holds for student attribute      // Data variable of type Data has four      // primitive datatypes roll -int name-      // String marks- int phone- long      System  .  out  .  println  (  data  .  roll     +     ' '     +     data  .  name      +     ' '     +     data  .  marks     +     ' '      +     data  .  phone  );      }      }      // Method 1      // Main driver method      public     static     void     main  (  String     args  []  )      {      // Custom input data      int     roll  []     =     {     1       2       3       4     };      String     name  []      =     {     'Shubham'       'Atul'       'Ayush'       'Rupesh'     };      int     marks  []     =     {     100       99       93       94     };      long     phone  []     =     {     8762357381L       8762357382L        8762357383L       8762357384L     };      // Creating an object of the class      GFG     custom     =     new     GFG  ();      // Now calling function to add the values to the      // arraylist      custom  .  addValues  (  roll       name       marks       phone  );      }   }   

الإخراج
1 Shubham 100 8762357381 2 Atul 99 8762357382 3 Ayush 93 8762357383 4 Rupesh 94 8762357384 

يمكن إنشاء قائمة ArrayList مخصصة في Java عن طريق توسيع فئة java.util.AbstractList وتنفيذ أساليبها. فيما يلي مثال لكيفية إنشاء قائمة ArrayList مخصصة:

Java
   import     java.util.AbstractList  ;   import     java.util.Arrays  ;   import     java.util.List  ;   public     class   CustomArrayList   <  E  >     extends     AbstractList   <  E  >     {      private     int     size     =     0  ;      private     static     final     int     DEFAULT_CAPACITY     =     10  ;      private     Object     elements  []  ;      public     CustomArrayList  ()     {      elements     =     new     Object  [  DEFAULT_CAPACITY  ]  ;      }      public     CustomArrayList  (  int     capacity  )     {      elements     =     new     Object  [  capacity  ]  ;      }      @Override      public     int     size  ()     {      return     size  ;      }      @Override      public     E     get  (  int     index  )     {      if     (  index     >=     size     ||     index      <     0  )     {      throw     new     IndexOutOfBoundsException  (  'Index: '     +     index     +     ' Size '     +     index  );      }      return     (  E  )     elements  [  index  ]  ;      }      @Override      public     void     add  (  int     index       E     element  )     {      if     (  index     >     size     ||     index      <     0  )     {      throw     new     IndexOutOfBoundsException  (  'Index: '     +     index     +     ' Size '     +     index  );      }      ensureCapacity  ();      for     (  int     i     =     size     -     1  ;     i     >=     index  ;     i  --  )     {      elements  [  i     +     1  ]     =     elements  [  i  ]  ;      }      elements  [  index  ]     =     element  ;      size  ++  ;      }      @Override      public     E     remove  (  int     index  )     {      if     (  index     >=     size     ||     index      <     0  )     {      throw     new     IndexOutOfBoundsException  (  'Index: '     +     index     +     ' Size '     +     index  );      }      Object     item     =     elements  [  index  ]  ;      for     (  int     i     =     index  ;     i      <     size     -     1  ;     i  ++  )     {      elements  [  i  ]     =     elements  [  i     +     1  ]  ;      }      size  --  ;      return     (  E  )     item  ;      }      private     void     ensureCapacity  ()     {      int     newSize     =     elements  .  length     *     2  ;      elements     =     Arrays  .  copyOf  (  elements       newSize  );      }      public     static     void     main  (  String  []     args  )     {      List   <  Integer  >     list     =     new     CustomArrayList   <>  ();      list  .  add  (  1  );      list  .  add  (  2  );      list  .  add  (  3  );      System  .  out  .  println  (  'CustomArrayList: '     +     list  );      }   }   

الإخراج
CustomArrayList: [1 2 3] 

في هذا المثال، يتم إنشاء ArrayList المخصص عن طريق توسيع فئة AbstractList وتنفيذ حجم الأساليب الخاص بها من خلال الإضافة والإزالة. تحتوي ArrayList المخصصة أيضًا على طريقة خاصة تسمى ضمان السعة والتي تضاعف حجم ArrayList إذا نفدت المساحة.

مزايا استخدام ArrayList مخصص في Java:

  1. المرونة: يتيح لك إنشاء ArrayList مخصص تخصيص سلوك ArrayList لتلبية الاحتياجات المحددة لتطبيقك.
  2. الفهم: يمكن أن يساعدك إنشاء ArrayList الخاص بك من البداية على فهم كيفية عمل ArrayLists وكيفية استخدامها بفعالية.

عيوب استخدام ArrayList مخصص في Java:

  1. استهلاك الوقت: يمكن أن يستغرق إنشاء قائمة ArrayList مخصصة وقتًا طويلاً ويتطلب خدمة جيدة

إنشاء اختبار