CodeGym /Blog Java /Ngẫu nhiên /Phương thức Sublist() trong Java: ArrayList và List

Phương thức Sublist() trong Java: ArrayList và List

Xuất bản trong nhóm

Phương thức subList() là gì?

Collections Framework là một thành phần rất phổ biến trong Java API. Giao diện danh sách và lớp ArrayList có lẽ là những công cụ quan trọng nhất trong Collections Framework. subList là một phương thức trong giao diện Danh sách cho phép bạn tạo một danh sách mới từ một phần của danh sách hiện có. Tuy nhiên, danh sách mới được tạo này chỉ là dạng xem có tham chiếu đến danh sách ban đầu. Phương thức Sublist() trong Java: ArrayList và List - 1Ví dụ: lấy danh sách [1,2,3,4,5,6]. Giả sử bạn muốn tạo một danh sách mới không có phần tử đầu tiên và cuối cùng. Trong trường hợp như vậy, phương thức list.subList() sẽ giúp bạn. Phương thức subList(fromIndex, toIndex) chỉ có một dạng và nó nhận hai đối số, đó là chỉ mục đầu tiên (fromIndex) và chỉ mục cuối cùng(đến Index) . Nó sẽ trả về phần giữa fromIndex toIndex dưới dạng danh sách mới. Có một điểm quan trọng cần nhớ. Danh sách mới được tạo sẽ bao gồm fromIndex và loại trừ toIndex. Vì vậy, thuật toán cho kịch bản trên sẽ giống như thế này. List = [1,2,3,4,5,6] newList = List.subList(1,5) Vì subList là một phương thức của giao diện List nên bạn có thể sử dụng nó trên các đối tượng ArrayList, LinkedList, Stack và Vector. Tuy nhiên, trong bài viết này, chúng ta sẽ chủ yếu tập trung vào các đối tượng ArrayList và LinkedList.

Ví dụ về phương thức subList trên đối tượng ArrayList.

Chúng tôi đang khai báo một ArrayList của các quốc gia. Sau đó, chúng tôi cố gắng trả lại phần giữa phần tử thứ 2 và thứ 4.

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);
    }
 }
Đầu ra của đoạn mã trên sẽ là
Danh sách các quốc gia:[USA, UK, France, Germany, Russia] Danh sách con của danh sách: [UK, France]
Trong ArrayList, giá trị chỉ mục của phần tử đầu tiên là 0. Do đó, giá trị chỉ mục của phần tử thứ hai và thứ tư lần lượt là 1 và 3. Vì vậy, chúng ta gọi phương thức sublist()list.subList(1, 3) . Tuy nhiên, hãy nhớ rằng phương thức subList trả về phần không bao gồm toIndex là phần tử thứ tư (“Đức”) trong trường hợp này. Do đó, nó sẽ chỉ xuất ra “UK”“France” . Vì đầu ra được trả về là một Danh sách, bạn có thể gọi trực tiếp bất kỳ phương thức Danh sách nào trên đó. Vậy điều gì sẽ xảy ra nếu chúng ta sử dụng cùng một chỉ mục cho cả hai tham số? Chỉ mục đó sẽ được bao gồm hay loại trừ trong danh sách được trả về? Hãy cùng tìm hiểu.

//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);
Đầu ra là
Danh sách con của danh sách: [ ]
Đầu ra là một danh sách trống. Mặc dù fromIndex chọn phần tử thứ 4, phương thức subList() sẽ loại bỏ nó vì nó cũng là toIndex.

Ví dụ về phương thức subList trên đối tượng LinkedList.

Trong ví dụ này, chúng ta sẽ sử dụng phương thức sublist trên một phần tử LinkedList. Một lần nữa, nó sẽ trả về danh sách giữa chỉ mục được chỉ định fromIndex(inclusive)toIndex(exclusive) . Hãy nhớ rằng chúng ta đã nói rằng danh sách được trả về bởi phương thức subList() chỉ là một dạng xem có tham chiếu đến danh sách ban đầu. Nếu bạn thực hiện bất kỳ thay đổi nào đối với danh sách phụ, nó cũng sẽ ảnh hưởng đến danh sách ban đầu. Chúng tôi cũng sẽ kiểm tra điều đó trong ví dụ này.

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()+" ");
    }
 }
}
Đầu ra sẽ trông như thế này:
Các phần tử của LinkedList: Node 1 Node 2 Node 3 Node 4 Node 5 Node 6 Node 7 Các phần tử của danh sách con: Node 3 Node 4 Node 5 Các phần tử của LinkedList LinkedList Sau khi loại bỏ Node 4: Node 1 Node 2 Node 3 Node 5 Node 6 nút 7

Điều gì sẽ xảy ra nếu các chỉ mục nằm ngoài giới hạn trong subList()?

Phương thức subList trả về hai loại ngoại lệ. Chúng ta hãy nhìn vào chúng. Hãy xem xét một tình huống nếu các chỉ mục được chỉ định nằm ngoài phạm vi của phần tử Danh sách (từ Index < 0 || to Index > size) . Sau đó, nó sẽ ném ra một 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
Ngoài ra, nếu fromIndex lớn hơn toIndex (fromIndex > toIndex) , thì phương thức subList() sẽ đưa ra lỗi 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)

Phần kết luận

Trong bài viết này, chúng ta đã thảo luận về phương thức subList và cách sử dụng nó. subList() loại bỏ nhu cầu về các hoạt động phạm vi rõ ràng (Đó là một loại hoạt động thường tồn tại đối với các mảng). Điều quan trọng nhất cần nhớ là phương thức subList không trả về một thể hiện mới mà là một dạng xem có tham chiếu đến danh sách ban đầu. Do đó, việc lạm dụng phương thức subList trên cùng một danh sách có thể khiến một luồng bị kẹt trong ứng dụng Java của bạn.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION