ما هي طريقة القائمة الفرعية ()؟
يعد Collections Framework مكونًا شائعًا جدًا في Java API. من المحتمل أن تكون واجهة القائمة وفئة ArrayList من أهم الأدوات في Collections Framework. القائمة الفرعية هي طريقة في واجهة القائمة تتيح لك إنشاء قائمة جديدة من جزء من القائمة الموجودة. ومع ذلك، هذه القائمة التي تم إنشاؤها حديثًا هي مجرد طريقة عرض تحتوي على مرجع إلى القائمة الأصلية. على سبيل المثال خذ قائمة [1،2،3،4،5،6]. لنفترض أنك تريد إنشاء قائمة جديدة بدون العنصرين الأول والأخير. في مثل هذا السيناريو، سوف تساعدك طريقة list.subList() . تحتوي طريقة subList(fromIndex, toIndex) على نموذج واحد فقط وتأخذ وسيطتين، وهما الفهرس الأول (fromIndex) والفهرس الأخير (toIndex) . سيُرجع الجزء الموجود بين fromIndex و toIndex كقائمة جديدة. هناك نقطة مهمة يجب أن نتذكرها. ستتضمن القائمة التي تم إنشاؤها حديثًا ملف fromIndex وتستبعد ملف toIndex. لذا فإن خوارزمية السيناريو أعلاه ستكون على هذا النحو. List = [1,2,3,4,5,6] newList = List.subList(1,5) نظرًا لأن القائمة الفرعية هي إحدى طرق واجهة القائمة، فيمكنك استخدامها على كائنات ArrayList وLinkedList وStack وVector. ومع ذلك، في هذه المقالة، سنركز بشكل أساسي على كائنات ArrayList وLinkedList.مثال على أسلوب القائمة الفرعية على كائن ArrayList.
نحن نعلن عن قائمة ArrayList للبلدان. ثم نحاول إرجاع الجزء الموجود بين العنصرين الثاني والرابع.import java.util.*;
public class Main {
public static void main(String[] args) {
// create an ArrayList
ArrayList list = new ArrayList();
// add values to ArrayList
list.add("USA");
list.add("UK");
list.add("France");
list.add("Germany");
list.add("Russia");
System.out.println("List of the countries:" + list);
//Return the subList : 1 inclusive and 3 exclusive
ArrayList new_list = new ArrayList(list.subList(1, 3));
System.out.println("The subList of the list: "+new_list);
}
}
سيكون إخراج الكود أعلاه
قائمة البلدان: [الولايات المتحدة الأمريكية، المملكة المتحدة، فرنسا، ألمانيا، روسيا] القائمة الفرعية للقائمة: [المملكة المتحدة، فرنسا]
في ArrayList، تكون قيمة فهرس العنصر الأول هي 0. وبالتالي، تكون قيم فهرس العنصرين الثاني والرابع هي 1 و3 على التوالي. لذلك، نقوم باستدعاء طريقة القائمة الفرعية () كـ list.subList(1, 3) . ومع ذلك، تذكر أن الأسلوب subList يُرجع الجزء باستثناء toIndex وهو العنصر الرابع ("ألمانيا") في هذه الحالة. وبالتالي ستخرج "المملكة المتحدة" و "فرنسا" فقط. نظرًا لأن المخرجات التي تم إرجاعها عبارة عن قائمة بحد ذاتها، فيمكنك استدعاء أي من أساليب القائمة مباشرة عليها. فماذا سيحدث إذا استخدمنا نفس الفهرس لكلا المعلمتين؟ هل سيتم تضمين هذا الفهرس أو استبعاده من القائمة التي تم إرجاعها؟ هيا نكتشف.
//execute subList() method with the same argument for both parameters.
ArrayList new_list2 = new ArrayList(list.subList(3, 3));
System.out.println("The subList of the list: "+new_list2);
الإخراج هو
القائمة الفرعية للقائمة: [ ]
الإخراج قائمة فارغة. على الرغم من أن fromIndex يحدد العنصر الرابع، فإن طريقة subList() ستزيله لأنه هو أيضًا toIndex.
مثال على أسلوب القائمة الفرعية على كائن LinkedList.
في هذا المثال، سوف نستخدم طريقة القائمة الفرعية على عنصر LinkedList. مرة أخرى، سيتم إرجاع القائمة بين الفهرس المحدد fromIndex(inclusive) و toIndex(exclusive) . تذكر أننا قلنا أن القائمة التي تم إرجاعها بواسطة طريقة subList() هي مجرد طريقة عرض تحتوي على مرجع إلى القائمة الأصلية. إذا قمت بإجراء أي تغييرات على القائمة الفرعية، فسوف يؤثر ذلك على القائمة الأصلية أيضًا. وسنختبر ذلك أيضًا في هذا المثال.import java.util.LinkedList;
import java.util.Iterator;
import java.util.List;
public class Main {
public static void main(String[] args) {
// Create a LinkedList
LinkedList linkedlist = new LinkedList();
// Add elements to LinkedList
for(int i = 0; i<7; i++){
linkedlist.add("Node "+ (i+1));
}
// Displaying LinkedList elements
System.out.println("Elements of the LinkedList:");
Iterator it= linkedlist.iterator();
while(it.hasNext()){
System.out.print(it.next()+ " ");
}
// invoke subList() method on the linkedList
List sublist = linkedlist.subList(2,5);
// Displaying SubList elements
System.out.println("\nElements of the sublist:");
Iterator subit= sublist.iterator();
while(subit.hasNext()){
System.out.print(subit.next()+" ");
}
/* The changes you made to the sublist will affect the original LinkedList
* Let’s take this example - We
* will remove the element "Node 4" from the sublist.
* Then we will print the original LinkedList.
* Node 4 will not be in the original LinkedList too.
*/
sublist.remove("Node 4");
System.out.println("\nElements of the LinkedList LinkedList After removing Node 4:");
Iterator it2= linkedlist.iterator();
while(it2.hasNext()){
System.out.print(it2.next()+" ");
}
}
}
سيبدو الإخراج كما يلي:
عناصر القائمة المرتبطة: العقدة 1 العقدة 2 العقدة 3 العقدة 4 العقدة 5 العقدة 6 العقدة 7 عناصر القائمة الفرعية: العقدة 3 العقدة 4 العقدة 5 عناصر القائمة المرتبطة القائمة المرتبطة بعد إزالة العقدة 4: العقدة 1 العقدة 2 العقدة 3 العقدة 5 العقدة 6 العقدة 7
ماذا سيحدث إذا كانت الفهارس خارج نطاق القائمة الفرعية ()؟
تقوم طريقة القائمة الفرعية بإرجاع نوعين من الاستثناءات. دعونا نلقي نظرة عليهم. ضع في اعتبارك موقفًا إذا كانت الفهارس المحددة خارج نطاق عنصر القائمة (fromIndex < 0 || toIndex > size) . ثم سيتم طرح IndexOutOfBoundExecption .//using subList() method with fromIndex <0
ArrayList new_list2 = new ArrayList(list.subList(-1, 3));
System.out.println("Portion of the list: "+new_list2);
Exception in thread "main" java.lang.IndexOutOfBoundsException: fromIndex = -1
// using subList() method with toIndex > size
ArrayList new_list2 = new ArrayList(list.subList(3, 6));
System.out.println("Portion of the list: "+new_list2);
Exception in thread "main" java.lang.IndexOutOfBoundsException: toIndex = 6
أيضًا، إذا كان fromIndex أكبر من toIndex (fromIndex > toIndex) ، فسيؤدي الأسلوب subList() إلى ظهور خطأ IllegalArgumentException .
//If fromIndex > toIndex
ArrayList new_list2 = new ArrayList(list.subList(5, 3));
System.out.println("Portion of the list: "+new_list2);
Exception in thread "main" java.lang.IllegalArgumentException: fromIndex(5) > toIndex(3)
خاتمة
في هذه المقالة، ناقشنا طريقة القائمة الفرعية وكيفية استخدامها. تلغي طريقة subList() الحاجة إلى عمليات النطاق الصريحة (وهو نوع من العمليات الموجودة عادة للمصفوفات). أهم شيء يجب أن تتذكره هو أن طريقة القائمة الفرعية لا تُرجع مثيلًا جديدًا، بل تُرجع طريقة عرض بمرجع إلى القائمة الأصلية. ولذلك، فإن الإفراط في استخدام أسلوب القائمة الفرعية في نفس القائمة يمكن أن يتسبب في توقف سلسلة رسائل في تطبيق Java الخاص بك.
المزيد من القراءة: |
---|
GO TO FULL VERSION