CodeGym /בלוג Java /Random-HE /שיטת Sublist() ב-Java: ArrayList ו- List
John Squirrels
רָמָה
San Francisco

שיטת Sublist() ב-Java: ArrayList ו- List

פורסם בקבוצה

מהי שיטת subList()?

מסגרת האוספים היא רכיב פופולרי מאוד ב-Java API. ממשק רשימה ומחלקה ArrayList הם כנראה הכלים החשובים ביותר במסגרת Collections. subList היא שיטה בממשק List המאפשרת לך ליצור רשימה חדשה מחלק מרשימה קיימת. עם זאת, הרשימה החדשה שנוצרה היא רק תצוגה עם הפניה לרשימה המקורית. שיטת Sublist() ב-Java: ArrayList ו- List - 1לדוגמה, קח את הרשימה של [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) מכיוון ש- subList היא שיטה של ​​ממשק רשימה, אתה יכול להשתמש בה באובייקטים ArrayList, LinkedList, Stack ו-Vector. עם זאת, במאמר זה נתמקד בעיקר באובייקטים ArrayList ו-LinkedList.

דוגמה לשיטת subList באובייקט 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 בהתאמה. לכן, אנו מפעילים את שיטת sublist() בתור list.subList(1, 3) . עם זאת, זכור ששיטת subList מחזירה את החלק ללא ה-toIndex שהוא האלמנט הרביעי ("גרמניה") במקרה זה. כך הוא יוציא "בריטניה" ו"צרפת " בלבד. מכיוון שהפלט המוחזר הוא List עצמו, אתה יכול לקרוא לכל שיטות List ישירות עליו. אז מה יקרה אם נשתמש באותו אינדקס עבור שני הפרמטרים? האם המדד הזה ייכלל או לא ייכלל ברשימה המוחזרת? בוא נגלה.
//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.

דוגמה לשיטת subList באובייקט LinkedList.

בדוגמה זו, נשתמש בשיטת sublist ברכיב LinkedList. שוב, זה יחזיר את הרשימה בין האינדקס שצוין fromIndex(כולל) ו- toIndex(בלעדי) . זכור שאמרנו שהרשימה המוחזרת על ידי שיטת 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()+" ");
    }
 }
}
הפלט ייראה כך:
אלמנטים של ה-LinkedList: Node 1 Node 2 Node 3 Node 4 Node 5 Node 6 Node 7 אלמנטים של תת-הרשימה: Node 3 Node 4 Node 5 אלמנטים של LinkedList LinkedList לאחר הסרת צומת 4: Node 1 Node 2 Node 3 Node 5 Node 6 צומת 7

מה יקרה אם האינדקסים יהיו מחוץ לתחום ב-subList()?

שיטת subList מחזירה שני סוגים של חריגים. בואו נסתכל עליהם. שקול מצב אם האינדקסים שצוינו נמצאים מחוץ לטווח של אלמנט List (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 וכיצד להשתמש בה. שיטת subList() מבטלת את הצורך בפעולות טווח מפורשות (זה סוג של פעולות שקיימות בדרך כלל עבור מערכים). הדבר החשוב ביותר לזכור הוא ששיטת subList לא מחזירה מופע חדש אלא תצוגה עם הפניה לרשימה המקורית. לכן, שימוש יתר בשיטת subList באותה רשימה עלול לגרום לשרשור תקוע ביישום Java שלך.
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION