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.
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() là 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” và “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) và 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)
GO TO FULL VERSION