Hướng dẫn và ví dụ Java ListIterator
1. ListIterator
ListIterator là một interface con của Iterator. Nó là một trong các cách giúp bạn duyệt qua (traverse) các phần tử của một List. Khác với Iterator, ListIterator hỗ trợ duyệt qua các phần tử theo cả 2 hướng tiến và lùi. ListIterator cũng hỗ trợ loại bỏ, cập nhập hoặc chèn một phần tử trong quá trình lặp.
public interface ListIterator<E> extends Iterator<E>
Dưới đây là so sánh giữa Iterator và ListIterator:
Iterator | ListIterator |
Được sử dụng để duyệt qua các phần tử của một Collection. | Được sử dụng để duyệt qua các phần tử của một List. |
Hỗ trợ duyệt qua các phần tử theo hướng tiến. | Hỗ trợ duyệt qua các phần tử theo hướng tiến và lùi. |
Có thể hỗ trợ việc loại bỏ một phần tử trong quá trình lặp (Tuỳ thuộc vào loại Collection) | Có thể hỗ trợ việc loại bỏ, cập nhập hoặc chèn một phần tử trong quá trình lặp (Tuỳ thuộc vào loại List). |
Không đảm bảo thứ tự lặp của các phần tử. | Đảm bảo thứ tự lặp của các phần tử. |
ListIterator methods
boolean hasPrevious()
E previous()
int nextIndex()
int previousIndex()
void set(E e) // Optional operation.
void add(E e) // Optional operation.
// Methods inherited from Iterator:
boolean hasNext()
E next();
default void remove() // Optional operation.
default void forEachRemaining(Consumer<? super E> action)
2. Example
Ví dụ: Sử dụng ListIterator để duyệt qua các phần tử của một List:
ListIteratorEx1.java
package org.o7planning.listiterator.ex;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class ListIteratorEx1 {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("One");
list.add("Two");
list.add("Three");
list.add("Four");
// Create ListIterator.
ListIterator<String> listIterator = list.listIterator();
String first = listIterator.next();
System.out.println("First:" + first);// -->"One"
String second = listIterator.next();
System.out.println("Second:" + second);// -->"Two"
if (listIterator.hasPrevious()) {
// Take a step back
String value = listIterator.previous();
System.out.println("Value:" + value);// -->"Two"
}
System.out.println(" ----- ");
while (listIterator.hasNext()) {
String value = listIterator.next();
System.out.println("value:" + value);
}
}
}
Output:
First:One
Second:Two
Value:Two
-----
value:Two
value:Three
value:Four
3. remove()
Trong quá trình đi qua (traverse) các phần tử của một Collection sử dụng Iterator, bạn có thể loại bỏ phần tử hiện tại ra khỏi Collection. Phương thức Iterator.remove() cho phép bạn làm điều đó. Tuy nhiên không phải tất cả các Iterator đều hỗ trợ hoạt động này, nó phụ thuộc vào kiểu Collection. Nếu không được hỗ trợ UnsupportedOperationException sẽ được ném ra.
Chú ý: Phương thức remove() được thừa kế từ Iterator.
// Optional operation
// Inherited from Iterator interface
public void remove()
Ví dụ: Một danh sách (List) chứa các số nguyên, loại bỏ các phần tử trong danh sách để đảm bảo rằng danh sách đó chỉ bao gồm các số nguyên tăng dần.
ListIterator_remove_ex1.java
package org.o7planning.listiterator.ex;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class ListIterator_remove_ex1 {
public static void main(String[] args) {
List<Integer> list= new ArrayList<Integer>();
list.add(11);
list.add(55);
list.add(22);
list.add(77);
list.add(33);
list.add(99);
list.add(11);
ListIterator<Integer> listIter = list.listIterator();
int temp = listIter.next();
while(listIter.hasNext()) {
int current = listIter.next();
if(current < temp) {
listIter.remove();
} else {
temp = current;
}
}
for(Integer value: list) {
System.out.println(value);
}
}
}
Output:
11
55
77
99
4. set(E e)
Trong quá trình đi qua (traverse) các phần tử của một List sử dụng ListIterator, bạn có thể cập nhập phần tử hiện tại. Phương thức ListIterator.set(E) cho phép bạn làm điều đó. Tuy nhiên không phải tất cả các ListIterator đều hỗ trợ hoạt động này, nó phụ thuộc vào kiểu List. Nếu không được hỗ trợ UnsupportedOperationException sẽ được ném ra.
public void set(E e)
Ví dụ: Một danh sách (List) chứa các số nguyên, nếu một phần tử của danh sách là số nguyên âm nó cần được thay thế bởi số 0.
ListIterator_set_ex1.java
package org.o7planning.listiterator.ex;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class ListIterator_set_ex1 {
public static void main(String[] args) {
List<Integer> list= new ArrayList<Integer>();
list.add(-111);
list.add(555);
list.add(-222);
list.add(777);
list.add(-333);
list.add(999);
list.add(111);
ListIterator<Integer> listIter = list.listIterator();
while(listIter.hasNext()) {
int current = listIter.next();
if(current < 0) {
listIter.set(0);
}
}
for(Integer value: list) {
System.out.println(value);
}
}
}
Output:
0
555
0
777
0
999
111
Ví dụ về một danh sách (List) không hỗ trợ hoạt động ListIterator.set:
ListIterator_set_ex2.java
package org.o7planning.listiterator.ex;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.ListIterator;
public class ListIterator_set_ex2 {
public static void main(String[] args) {
List<Integer> aList = Arrays.asList(-111, 555,-222,777,-333,999,111);
// UnmodifiableList
// This list does not support "set" operation!
List<Integer> unmodifiableList = Collections.unmodifiableList(aList);
ListIterator<Integer> listIter = unmodifiableList.listIterator();
int current = listIter.next();
listIter.set(1000); // throw UnsupportedOperationException
}
}
Output:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.base/java.util.Collections$UnmodifiableList$1.set(Collections.java:1353)
at org.o7planning.listiterator.ex.ListIterator_set_ex2.main(ListIterator_set_ex2.java:21)
5. add(E e)
Trong quá trình đi qua (traverse) các phần tử của một List sử dụng ListIterator, bạn có thể chèn một phần tử vào List. Phương thức ListIterator.add(E) cho phép bạn làm điều đó. Tuy nhiên không phải tất cả các ListIterator đều hỗ trợ hoạt động này, nó phụ thuộc vào kiểu List. Nếu không được hỗ trợ UnsupportedOperationException sẽ được ném ra.
public void add(E e);
Ví dụ:
ListIterator_add_ex1.java
package org.o7planning.listiterator.ex;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class ListIterator_add_ex1 {
public static void main(String[] args) {
List<String> list= new ArrayList<String>();
list.add("One");
list.add("Two");
list.add("Three");
list.add("Four");
list.add("Five");
ListIterator<String> listIter = list.listIterator();
listIter.next(); // "One"
listIter.next(); // "Two"
listIter.next(); // "Three"
listIter.previous(); // "Three"
listIter.add("X1");
for(String value: list) {
System.out.println(value);
}
}
}
Output:
One
Two
X1
Three
Four
Five
Ví dụ về một List không hỗ trợ hoạt động ListIterator.add:
ListIterator_add_ex2.java
package org.o7planning.listiterator.ex;
import java.util.Arrays;
import java.util.List;
import java.util.ListIterator;
public class ListIterator_add_ex2 {
public static void main(String[] args) {
// Fixed-size List
// It does not support add or set operation.
List<String> list= Arrays.asList("One","Two","Three","Four","Five");
ListIterator<String> listIter = list.listIterator();
listIter.next(); // "One"
listIter.next(); // "Two"
listIter.next(); // "Three"
listIter.previous(); // "Three"
listIter.add("X1"); // throw UnsupportedOperationException
}
}
Output:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.base/java.util.AbstractList.add(AbstractList.java:153)
at java.base/java.util.AbstractList$ListItr.add(AbstractList.java:451)
at org.o7planning.listiterator.ex.ListIterator_add_ex2.main(ListIterator_add_ex2.java:19)
Các hướng dẫn Java Collections Framework
- Hướng dẫn và ví dụ Java PriorityBlockingQueue
- Hướng dẫn sử dụng nền tảng tập hợp trong Java (Java Collection Framework)
- Hướng dẫn và ví dụ Java SortedSet
- Hướng dẫn và ví dụ Java List
- Hướng dẫn và ví dụ Java Iterator
- Hướng dẫn và ví dụ Java NavigableSet
- Hướng dẫn và ví dụ Java ListIterator
- Hướng dẫn và ví dụ Java ArrayList
- Hướng dẫn và ví dụ Java CopyOnWriteArrayList
- Hướng dẫn và ví dụ Java LinkedList
- Hướng dẫn và ví dụ Java Set
- Hướng dẫn và ví dụ Java TreeSet
- Hướng dẫn và ví dụ Java CopyOnWriteArraySet
- Hướng dẫn và ví dụ Java Queue
- Hướng dẫn và ví dụ Java Deque
- Hướng dẫn và ví dụ Java IdentityHashMap
- Hướng dẫn và ví dụ Java WeakHashMap
- Hướng dẫn và ví dụ Java Map
- Hướng dẫn và ví dụ Java SortedMap
- Hướng dẫn và ví dụ Java NavigableMap
- Hướng dẫn và ví dụ Java HashMap
- Hướng dẫn và ví dụ Java TreeMap
- Hướng dẫn và ví dụ Java PriorityQueue
- Hướng dẫn và ví dụ Java BlockingQueue
- Hướng dẫn và ví dụ Java ArrayBlockingQueue
- Hướng dẫn và ví dụ Java TransferQueue
Show More